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-Key: 6259300648

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

Printed on: April 27, 2024 at 10:04 o'clock

Mitglied: 3063370895
Solution 3063370895 Mar 07, 2023 updated at 14:11:21 (UTC)
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
Member: broesel73
broesel73 Mar 07, 2023 at 14:06:26 (UTC)
Goto Top
Ok Danke, das teste ich mal direkt face-smile
Member: broesel73
broesel73 Mar 07, 2023 at 14:57:48 (UTC)
Goto Top
Super hat geklappt !!