broesel73
Goto Top

Remote Abfrage von Netzlaufwerken mit PS

Ich würde gerne wissen welche Netzlaufwerke unsere User alle zur Zeit verbunden haben.
Leider gibt es außer dem Home Laufwerk keine Allgemein gültigen Laufwerke.
Deswegen wollen wir jetzt auslesen was alle Benutzer verbunden haben und dann anfangen das zusammenzufassen und per Script neu zu vergeben.
In diesem Zuge suche ich eine Möglichkeit per Powershell die Laufwerke auszulesen.
Ich bin soweit gewesen das ganz mit

 
$username = "xxx\xxx"  
$password = "xxxx"  
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr

$Import = Get-ADComputer -filter {name -like "*"} -Properties * | Where-Object {$_.CanonicalName -like "*xxx/xxx*"} | Select-Object Name  

foreach ($cpname in $Import.name)
{
$session1 = New-PSSession -ComputerName $cpname -Credential $cred
$shinfo = Invoke-Command -session $session1 -scriptblock { Get-CimInstance -ClassName Win32_MappedLogicalDisk | Select PSComputerName, Name,ProviderName}
Write-Host $cpname "hat folgende Laufwerke" $shinfo.name  
}

zu versuchen, aber dann bekomme ich nichts zurück, da ich mich ja mit dem Admin angemeldet habe und nicht mit dem aktuellen User.
Vielleicht denk ich auch gerade viel zu kompliziert, aber hat jemand eine Idee für eine Lösung ??

Content-ID: 6259300648

Url: https://administrator.de/contentid/6259300648

Ausgedruckt am: 23.11.2024 um 04:11 Uhr

3063370895
Lösung 3063370895 07.03.2023 aktualisiert um 15:11:21 Uhr
Goto Top
Hi,

du musst die nicht geladenen Registry-Hives der Nutzer laden und dann aus der Registry die verbundenen Laufwerke auslesen.

Habe dazu mal ein Skript geschrieben, musst du eventuell noch was anpassen:
Im Moment ruft es alle PCs aus dem AD ab.

$computers = (Get-ADComputer -Filter { enabled -eq $true }).Name | Sort-Object Name


$scriptblock = {
    
    $PatternSID = 'S-1-5-21-\d+-\d+\-\d+\-\d+$'  
 
    $ProfileList = Get-ItemProperty -ea SilentlyContinue 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*' | Where-Object { $_.PSChildName -match $PatternSID } |   
    Select-Object  @{name = "SID"; expression = { $_.PSChildName } },   
    @{name = "UserHive"; expression = { "$($_.ProfileImagePath)\ntuser.dat" } },   
    @{name = "Username"; expression = { $_.ProfileImagePath -replace '^(.*[\\\/])', '' } }  
 
    $LoadedHives = Get-ChildItem -ea SilentlyContinue Registry::HKEY_USERS | Where-Object { $_.PSChildname -match $PatternSID } | Select-Object @{name = "SID"; expression = { $_.PSChildName } }  
 
    $UnloadedHives = Compare-Object -ea SilentlyContinue $ProfileList.SID $LoadedHives.SID | Select-Object @{name = "SID"; expression = { $_.InputObject } }, UserHive, Username  
 
    Foreach ($item in $ProfileList) {
        IF ($item.SID -in $UnloadedHives.SID) {
            reg load HKU\$($Item.SID) $($Item.UserHive) | Out-Null
        }

        "{0}: {1}" -f $($env:computername), $($item.Username) | Write-Output  
        $drives = Get-ChildItem -ea SilentlyContinue registry::HKEY_USERS\$($Item.SID)\Network 
        if ($null -ne $drives) {
            $drives | ForEach-Object {
                $drive = Get-ItemProperty -ea SilentlyContinue -Path "Registry::$_"  
                "{0} {1}" -f "   Name:", $($drive.PSChildName) | Write-Output  
                "{0} {1}" -f "   Path:", $($drive.RemotePath) | Write-Output  
    
            }
    
        }

        if ($item.SID -in $UnloadedHives.SID) {
            [gc]::Collect()
            reg unload HKU\$($Item.SID) | Out-Null
        }
    }
}
Invoke-Command $computers -sc $scriptblock
broesel73
broesel73 07.03.2023 um 15:06:26 Uhr
Goto Top
Ok Danke, das teste ich mal direkt face-smile
broesel73
broesel73 07.03.2023 um 15:57:48 Uhr
Goto Top
Super hat geklappt !!