我有一个 Windows XP/Server 2003 环境,用户使用任意驱动器号自行映射了不同的网络驱动器。其中一些用户不知道如何辨别这些驱动器的真实 UNC 路径,我希望能够运行脚本或程序来查询这些驱动器并向我显示驱动器号和相应的 UNC 路径。我希望在该用户的上下文中看到“net use”之类的输出,以便我可以看到他们映射了哪些驱动器。我需要使用自己的管理员帐户来执行此操作,这就是困难所在。我知道这些信息将存储在 HKCU 注册表中?我希望能够在 Powershell 中执行此操作,但 vbscript 甚至独立可执行文件也可以。谢谢。
答案1
您正在寻找的密钥位于此处:
\\HKCU\Network
每个映射驱动器都由一个以驱动器号命名的注册表项表示。映射的属性包含在值中 - 您最可能感兴趣的是:
RemotePath REG_SZ
UserName REG_SZ
这些键只存在于持久连接中,我认为您无法在注册表中找到瞬态映射。
这种方法的最大问题是,您必须在用户登录时远程连接到用户计算机,或者连接并枚举用户配置文件,将其映射到 SID,然后在 HKEY_USERS 下的相关键中搜索以找到用户配置单元的相关副本。如果您打算经常这样做,那么这将需要一些工作,而且可能会很慢。
如果这是一个常规支持问题,那么为什么不向他们提供一个执行如下操作的批处理文件的链接:
Net use > \\someserver\someshare\%username%.drives
然后,您只需在共享中查找 Username.drives 文件,即可获得所需内容的精确副本。将其放入登录脚本中,您就会获得定期刷新的副本,但如果您真的不需要这些信息,您显然不想这样做。
编辑添加 如果你想使用一些 Powershell 脚本来实现这一点,有一个示例脚本这篇博文Hugo Peeters 介绍了如何连接到远程注册表,但您必须弄清楚如何将用户名映射到其 SID,以便您可以在 HKEY_USERS 下选择正确的密钥。每个在目标计算机上拥有配置文件的用户都有一个 HKCU 密钥副本,保存在以其 SID 命名的密钥下,您需要找到正确的密钥,然后从该密钥下提取网络密钥信息。
答案2
假设您在 C:\Workstations.txt 中有一个所有工作站的列表,您可以使用 Powershell 查询每台计算机上的 WMI,并将登录用户的当前映射输出到以计算机命名的文本文件中。
# Load list into variable, which will become an array of strings
$computerlist = Get-Content C:\Workstations.txt
# Prompt for credentials that have rights to access WMI on the computers
$cred = Get-Credential
# Loop through each item in the array (each computer in the list of computers we loaded into the variable)
ForEach ($computer in $computerlist)
{
# Query WMI on computer using credentials and output to file with width setting so we see everything
Get-WmiObject Win32_NetworkConnection -computerName $computer -credential $cred | Select LocalName,RemoteName | Out-File C:\WorkstationMappings\$env:username.txt -width 120
}
答案3
在 WMI/VBScript 中,列出当前用户的映射驱动器所需的位是:
Set objNetwork = WScript.CreateObject("WScript.Network")
Set colDrives = objNetwork.EnumNetworkDrives
For i = 0 to colDrives.Count-1 Step 2
Wscript.Echo colDrives.Item(i) & vbTab & colDrives.Item (i + 1)
Next
显然,这仅列出了运行该程序的机器上当前登录用户的列表。
我们正在进行一项练习,以发现当前所有用户的映射驱动器,并在每个用户的上下文中运行这样的脚本,以获取该信息并转储到网络共享,我们可以在其中获取文件并稍后使用另一个脚本解析它们:
scriptVersion = "1.0"
Set objShell = CreateObject("WScript.shell")
Set objEnv = objShell.Environment("Process")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objNetwork = CreateObject("WScript.Network")
strUserName = objEnv("USERNAME")
strComputerName = lcase(objEnv("COMPUTERNAME"))
bPath = "\\servername\sharename" ' Server and path to save files
bFile = bPath & "\" & strComputerName &"-" & strUserName & "-NetDrives.txt"
'Setup output file
If objFSO.FileExists(bFile) then
Set objTextFile = objFSO.OpenTextFile(bFile, 8, True) ' 8 = appending
Else
Set objTextFile = objFSO.OpenTextFile(bFile, 2, True) ' 2 = writing
End if
objTextFile.WriteLine Now & " ::: Drive mappings listing v" & scriptVersion
'Loop through current network drives
Set colDrives = objNetwork.EnumNetworkDrives
For i = 0 to colDrives.Count-1 Step 2
objTextFile.WriteLine colDrives.Item(i) & vbTab & colDrives.Item (i + 1)
Next
Set objShell = Nothing
Set objFSO = Nothing
Set objNetwork = Nothing
Wscript.Quit(ExitErrorLevel)
然后可以将其放入登录脚本中或使用软件分发工具(如 Microsoft SMS/SCCM)运行。