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

Каков наилучший способ сканирования, чтобы определить, какие сопоставления дисков установлены для всех зарегистрированных пользователей на всех рабочих столах домена? Это будет использоваться для определения того, какие буквы дисков используются в среде.

Это в корпоративной среде в домене Active Directory 2003. В настоящее время я использую объявление SMS 2003, которое запускает "net use" и передает в файл журнала. Требуется очень много времени, чтобы поразить каждый рабочий стол. Есть ли способ лучше?

4 ответа

Решение

Все эти ответы были очень хорошими подсказками, чтобы заставить меня идти. Спасибо.

Я наткнулся на этот пример VBScript, который делает именно то, что я искал и работает хорошо.

Вот фрагмент кода из этого поста:

'Define variables, constants and objects

strComputer="REMOTE MACHINE HERE"
Const HKEY_USERS = &H80000003
Set objWbem = GetObject("winmgmts:")
Set objRegistry = GetObject("winmgmts://" & strComputer & "/root/default:StdRegProv")
Set objWMIService = GetObject("winmgmts:"  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

'Go and get the currently logged on user by checking the owner of the Explorer.exe process.  

Set colProc = objWmiService.ExecQuery("Select Name from Win32_Process" & " Where Name='explorer.exe' and SessionID=0")

If colProc.Count > 0 Then
   For Each oProcess In colProc
       oProcess.GetOwner sUser, sDomain
   Next
End If

'Loop through the HKEY_USERS hive until (ignoring the .DEFAULT and _CLASSES trees) until we find the tree that 
'corresponds to the currently logged on user.
lngRtn = objRegistry.EnumKey(HKEY_USERS, "", arrRegKeys)    

For Each strKey In arrRegKeys
   If UCase(strKey) = ".DEFAULT" Or UCase(Right(strKey, 8)) = "_CLASSES" Then
   Else

       Set objSID = objWbem.Get("Win32_SID.SID='" & strKey & "'")

'If the account name of the current sid we're checking matches the accountname we're looking for Then
'enumerate the Network subtree
       If objSID.accountname = sUser Then 
           regpath2enumerate = strkey & "\Network" 'strkey is the SID
           objRegistry.enumkey hkey_users, regpath2enumerate, arrkeynames

'If the array has elements, go and get the drives info from the registry
           If Not (IsEmpty(arrkeynames)) Then
               For Each subkey In arrkeynames
                   regpath = strkey & "\Network\" & subkey
                   regentry = "RemotePath"
                   objRegistry.getstringvalue hkey_users, regpath, regentry, dapath
                   wscript.echo subkey & ":" & vbTab & dapath
               Next
           End If
       End If
   End If
Next

Самым быстрым способом может быть использование WMI. Если вы знакомы с Perl, вы даже можете использовать модули Win32. Где-то здесь у меня есть сценарий, который даст большую часть этой информации.

Может быть, есть и лучший способ, но то, как вы делаете это сейчас, на самом деле очень хорошо, и, хотя это кажется медленным, скорость не должна быть проблемой.

Ваши пользователи не меняют свои сопоставления ежедневно, и даже если это так, вы, вероятно, заботитесь только о тех сопоставлениях, которые являются относительно постоянными.

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

-Адам

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

Другие вопросы по тегам