Как показать путь к подключенному диску удаленных компьютеров?

Я заставил это работать локально, однако в удаленной системе он не показывает путь, а только букву диска. Моя цель - заставить его показать путь к диску удаленного хоста.

Также иногда он не показывает все диски, подключенные к удаленному компьютеру, и я не знаю, почему.

Я попытался изменить Win32_LogicalDisk на MappedLogicalDisk, но это просто не дает никакой информации.

$DISK = Get-WmiObject -computer $compname Win32_LogicalDisk
foreach ($device in $DISK){
    Write-Host      "Drive: " $device.name
    Write-Host      "Path:  " $device.ProviderName
""
}
Pause
CheckHost

person Aaron    schedule 15.01.2019    source источник
comment
Поскольку большинство сопоставлений дисков создаются в пользовательском пространстве, мне не известен действительно элегантный способ показать эти сопоставления.   -  person bluuf    schedule 15.01.2019
comment
Это хороший момент, что, если бы он мог подключиться к удаленному хосту и получить информацию от вошедшего в систему пользователя, если пользователь вошел в систему? возможно ли это?   -  person Aaron    schedule 15.01.2019
comment
Вы не можете удаленно подключиться к сеансу пользователя с помощью Powershell (известные обходные пути: используйте запланированное задание или используйте PSExec)   -  person bluuf    schedule 15.01.2019


Ответы (1)


Попробуйте один из этих примеров:

Вот этот...

$ComputerName = "ServerName"

gwmi win32_mappedlogicaldisk -ComputerName $ComputerName | 
    select SystemName, Name, ProviderName, SessionID | 
    foreach { 
    $disk = $_
    $user = gwmi Win32_LoggedOnUser -ComputerName $ComputerName | 
        where { ($_.Dependent.split("=")[-1] -replace '"') -eq $disk.SessionID} | 
        foreach {$_.Antecedent.split("=")[-1] -replace '"'}
    $disk | select Name, ProviderName, @{n = "MappedTo"; e = {$user} }
}

Или этот

function Get-MappedDrives($ComputerName)
{
$output = @()

if(Test-Connection -ComputerName $ComputerName -Count 1 -Quiet)
{
    $Hive = [long]$HIVE_HKU = 2147483651

    $sessions = Get-WmiObject -ComputerName $ComputerName -Class win32_process | 
    ?{$_.name -eq "explorer.exe"}

    if($sessions)
    {
    foreach($explorer in $sessions)
    {
        $sid = ($explorer.GetOwnerSid()).sid

        $owner  = $explorer.GetOwner()

        $RegProv = get-WmiObject -List -Namespace "root\default" -ComputerName $ComputerName | 
        Where-Object {$_.Name -eq "StdRegProv"}

        $DriveList = $RegProv.EnumKey($Hive, "$($sid)\Network")
        if($DriveList.sNames.count -gt 0)
        {
        foreach($drive in $DriveList.sNames)
        {
        $output += "$($drive)`t$(($RegProv.GetStringValue($Hive, "$($sid)\Network\$($drive)", 
        "RemotePath")).sValue)`t$($owner.Domain)`t$($owner.user)`t$($ComputerName)"
        }
        }
        else{write-debug "No mapped drives on $($ComputerName)"}
    }
    }
    else{write-debug "explorer.exe not running on $($ComputerName)"}
}
else{write-debug "Can't connect to $($ComputerName)"}
return $output
}

<#
#Enable if you want to see the write-debug messages
$DebugPreference = "Continue"

$list = "Server01", "Server02"
$report = $(foreach($ComputerName in $list){Get-MappedDrives $ComputerName}) | 
ConvertFrom-Csv -Delimiter `t -Header Drive, Path, Domain, User, Computer
#>
person postanote    schedule 15.01.2019