如何在远程用户会话

时间:2015-05-21 15:46:37

标签: windows powershell registry remote-access

我需要在远程会话上获得真正的映射驱动器,我读取路径和名称的远程注册表,但\ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ MountPoints2

中缺少标签(驱动器号)

如果我读HKCU \ Network我只有持久驱动器(缺少状态为Replace的GPP驱动器)。

如何找到路径,名称和标签?

function get-Drives {
        param ( [ValidateNotNullOrEmpty()] $Computername, [ValidateNotNullOrEmpty()] $SID )
        try {
            $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('USERS', $computerName)
            $RegKey = $Reg.OpenSubKey("$SID\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MountPoints2")
            $lecteurs = $RegKey.GetSubKeyNames()
            $lecteurs | ?{$_ -notlike '{*}'} | %{
                $RegKey = $Reg.OpenSubKey("$SID\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MountPoints2\\$_")
                $_LabelFromReg = $regKey.GetValue('_LabelFromReg')
                if ($_LabelFromReg) {
                    [pscustomobject]@{
                        Name = $_LabelFromReg
                        Label = ''
                        Path = $_ -replace('#','\')
                    }
                }
            }
        } catch {
        }
    }

2 个答案:

答案 0 :(得分:1)

远程获取映射驱动器容易出错。从用户那里获取列表要简单得多,也不那么麻烦。这是一个可以提供给用户的简短WSH JScript脚本。用户可以运行此命令以获得映射驱动器和位置的快速对话框:

// mappedDrives.js

var wshNetwork = new ActiveXObject("WScript.Network");
var networkDrives = wshNetwork.EnumNetworkDrives();
var results = "";
for ( var i = 0; i < networkDrives.length; i += 2 ) {
  var resultLine = networkDrives.Item(i) + " -> " + networkDrives.Item(i + 1);
  if ( results != "" ) {
    results += "\r\n" + resultLine;
  }
  else {
    results = resultLine;
  }
}

var wshShell = new ActiveXObject("WScript.Shell");
if ( results != "" ) {
  wshShell.Popup(results, 0, "Mapped Drives");
}
else {
  wshShell.Popup("No mapped drives detected", 0, "Mapped Drives");
}

答案 1 :(得分:0)

编辑正如@Alban所指出的,这不会获取当前登录用户的映射驱动器,只会获取计算机映射的驱动器。我会在这里留下答案,因为它可能对将来需要的人有用,但显然不是OP需要的。

假设您的帮助台可以访问远程WMI调用,您可以使用Win32_LogicalDisk WMI类执行此操作。映射的驱动器为DriveType 4,因此请对其进行过滤,然后返回DeviceIDProviderNameVolumeName。或者重命名它们以便于阅读:

gwmi -class win32_logicaldisk -Computer $ComputerName | Where{$_.DriveType -eq 4} | select @{n='DriveLetter';e={$_.DeviceID}},VolumeName,@{n='NetworkPath';e={$_.ProviderName}}

足够简单吧?这是我在本地计算机上运行它的原因:

DriveLetter        VolumeName          NetworkPath
-----------        ----------          -----------
X:                 OSDisk              \\localhost\c$\temp

我非常肯定应该针对任何当前映射的驱动器对远程计算机起作用。