Como posso saber quais unidades de rede os usuários mapearam?

5

Qual é a melhor maneira de verificar quais mapeamentos de unidade estão definidos para todos os usuários conectados em todos os desktops no domínio? Isso será usado para determinar quais letras de unidade estão em uso no ambiente.

Isso está em um ambiente corporativo em um domínio do Active Directory 2003. Atualmente, uso um anúncio do SMS 2003 que executa "net use" e canaliza para um arquivo de log. Demora muito tempo para chegar a todos os computadores. Existe uma maneira melhor?

    
por spoulson 30.04.2009 / 17:06

4 respostas

1

Todas essas respostas foram muito boas pistas para me seguir em frente. Obrigado.

Eu passei por este exemplo do VBScript que faz exatamente o que eu estava procurando e funciona bem.

Este é o snippet de código dessa postagem:

'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
    
por 07.05.2009 / 14:00
1

O caminho mais rápido pode estar usando WMI . Se você é adepto do Perl, você pode até usar os módulos Win32 . Em algum lugar por aqui, tenho um script que dará a maioria dessas informações.

    
por 30.04.2009 / 17:47
0

Pode haver uma maneira melhor, mas a maneira como você está fazendo isso agora é muito boa e, embora pareça lenta, a velocidade não deve ser um problema.

Seus usuários não estão alterando seus mapeamentos diariamente e, mesmo que sejam, você provavelmente só se preocupa com os mapeamentos que são relativamente permanentes.

A execução do anúncio net use, embora demore um pouco, só precisa ser feito algumas vezes por mês para manter o controle dos mapeamentos de unidade.

-Adam

    
por 30.04.2009 / 17:23
0

Na verdade, eu escrevi um programa em um momento que seria executado como parte do script de login e coletaria essas informações, em seguida, publicá-lo em um banco de dados com um site. Isso seria algo que você estaria interessado em correr? Eu poderia tirar o código antigo e entregá-lo se quiser.

    
por 30.04.2009 / 17:49