Script para listar as unidades de rede mapeadas do usuário atual

1

Eu tenho um ambiente Windows XP / Server 2003 aqui os usuários mapearam unidades de rede diferentes usando letras de unidade arbitrárias. Alguns desses usuários não sabem como informar o verdadeiro caminho UNC dessas unidades, e gostaria de poder executar um script ou programa para consultar essas unidades e mostrar as letras da unidade e os caminhos UNC correspondentes. Eu gostaria de ver a saída como "net use" no contexto desse usuário para que eu possa ver quais drives ELES mapearam. Eu precisaria fazer isso usando minha própria conta de administrador, que é onde está a dificuldade. Eu entendo que esta informação seria armazenada no registro HKCU? Eu adoraria poder fazer isso no Powershell, mas um executável vbscript ou mesmo um executável independente funcionaria. Obrigado.

    
por Dmart 05.11.2009 / 18:04

3 respostas

4

As chaves que você está procurando estão localizadas aqui:

\HKCU\Network

Cada unidade mapeada é representada por uma chave do Registro nomeada para a letra da unidade. As propriedades do mapeamento estão contidas em valores - as mais prováveis de se interessar são:

RemotePath REG_SZ
UserName   REG_SZ

As chaves só existirão para conexões persistentes, não acho que você possa encontrar mapeamentos temporários no registro.

O maior problema com essa abordagem é que você deve se conectar remotamente à máquina dos usuários enquanto eles estiverem conectados ou conectar e enumerar os perfis de usuários, mapeá-los para SIDs e pesquisar na Chave relevante abaixo de HKEY_USERS para localizar o cópia relevante da seção de usuários. Isso vai ser um pouco trabalhoso e pode ser muito lento se você pretende fazer muito.

Se este for um problema de suporte regular, por que não fornecer um link para um arquivo em lote que faça algo como:

Net use > \someserver\someshare\%username%.drives

Depois, basta procurar no compartilhamento do arquivo Username.drives uma cópia precisa do que você precisa. Coloque isso em um script de logon e você terá uma cópia regularmente atualizada, mas obviamente você não quer fazer isso se realmente não precisar da informação.

Editado para adicionar Se você quiser prosseguir com isso usando alguns scripts Powershell, há um exemplo de script em esta postagem no blog de Hugo Peeters que mostra como se conectar a um registro remoto, mas você terá que descobrir como mapear o nome de usuário para seu SID para poder escolher a chave correta em HKEY_USERS. Cada usuário que tem um perfil na máquina de destino tem uma cópia da chave HKCU salva em uma chave nomeada com seu SID, você precisa encontrar a chave correta e, em seguida, extrair as informações da chave de rede.

    
por 05.11.2009 / 21:11
2

Supondo que você tinha uma lista de todas as estações de trabalho em C: \ Workstations.txt, você poderia usar o Powershell para consultar o WMI em cada computador e exibir os mapeamentos atuais do usuário conectado em um arquivo de texto com o nome do computador. / p>

# 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
}
    
por 05.11.2009 / 22:27
0

No WMI / VBScript, o bit que você precisa para listar as unidades mapeadas do usuário atual é:

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

Isso, obviamente, apenas os lista para o usuário atualmente conectado na máquina em que ele é executado.

Estamos executando um exercício para descobrir as unidades mapeadas de todos os usuários no momento e executando um script como esse no contexto de cada usuário para obter essas informações e fazer o download para um compartilhamento de rede onde podemos pegar os arquivos e analisá-los com outro script depois:

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)

Isso pode ser colocado em um script de login ou executado com uma ferramenta de distribuição de software, como o Microsoft SMS / SCCM.

    
por 07.01.2010 / 11:19