Назад | Перейти на главную страницу

Скрипт для вывода списка подключенных сетевых дисков текущего пользователя

У меня есть среда 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.