У меня есть среда Windows XP / Server 2003, здесь пользователи сами подключили разные сетевые диски, используя произвольные буквы дисков. Некоторые из этих пользователей не знают, как определить истинный путь UNC к этим дискам, и я хотел бы иметь возможность запустить сценарий или программу, чтобы запросить эти диски и показать мне буквы дисков и соответствующие пути UNC. Я хотел бы видеть вывод типа "net use" в контексте этого пользователя, чтобы я мог видеть, какие диски ОНИ сопоставили. Мне нужно было бы сделать это, используя свою собственную учетную запись администратора, в этом и заключается трудность. Я так понимаю, эта информация будет храниться в реестре HKCU? Я хотел бы иметь возможность сделать это в Powershell, но подойдет vbscript или даже отдельный исполняемый файл. Спасибо.
Ключи, которые вы ищете, находятся здесь:
\\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, вам нужно найти правильный, а затем извлечь информацию о сетевом ключе из-под него.
Предполагая, что у вас есть список всех рабочих станций в 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
}
В 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.