Método para encontrar rapidamente caminhos de pastas, considerando muitos nomes de compartilhamento de rede (Windows)

1

Atualmente, estou analisando os locais de milhares de diretórios pessoais na minha organização. Eu executei um script que cospe cada usuário junto com seu diretório pessoal (nome do compartilhamento) em um csv.

Import-Module ActiveDirectory
Get-ADUser -SearchBase "OU=Users,DC=org,DC=com" -Filter * -Property * |
    Select-Object -Property sAMAccountName,homeDirectory|
        Export-CSV -Path C:\homedirs.csv

Ou revisando esse script ou operando no arquivo resultante, como posso produzir o mesmo resultado, mas com cada compartilhamento substituído pelo caminho real que ele representa?

Também saiba que esses compartilhamentos estão localizados em vários servidores.

Editar: parece que as informações retornadas por wmic /node:<servernames> share pode ser útil para checar a lista de nomes de compartilhamento que eu já tenho, mas como posso amarrar isso?

    
por Bobazonski 26.06.2015 / 18:03

1 resposta

2

Eu realizaria a tarefa de maneira semelhante a esta:

  1. Obtenha os dados do AD em um hashtable.
  2. Loop, leia o caminho completo do compartilhamento (e os outros campos também, para poder imprimi-los em um novo csv).
  3. A partir do caminho, saia do servername do nome de compartilhamento usando o método de divisão
  4. Use o cmdlet get-wmiobject para ligar para o servidor e obter o caminho local usando o nome do servidor e o nome do compartilhamento extraídos na etapa anterior.
  5. Como sugestão apenas, exiba o caminho de compartilhamento completo, o servidor, o nome de compartilhamento e o caminho de compartilhamento local para um novo arquivo csv (isto é, armazene todas as informações extraídas do arquivo original caso encontre outro uso para ele).
  6. Loopback

Isso poderia ser otimizado, por exemplo, chamando cada servidor único uma vez e executando todas as consultas de compartilhamento para esse servidor localmente em lote (usando invoke-command , por exemplo, e / ou executando como workflow para processar vários servidores em paralelo).

[EDIT] Aqui está um exemplo concreto com base nos passos acima.

Espera-se que a entrada para o homedir esteja no formato \\ servername \ sharename \ subdir

Ao processar, escolhi estar interessado apenas em \\ servername \ sharename

Saída eu escolho ser sAMAccountName; homeDirectory; ServerName; ShareName; ShareLocalPath

Dependendo do que você está procurando, naturalmente.

Import-Module -Name ActiveDirectory

$Cred = Get-Credential
$CsvFile = 'E:\temp49\homedirs2.csv'

# Read the data from AD into a hashtable.
if ($HashTable) {Remove-Variable HashTable}
$HashTable = Get-ADUser -Filter * -Property sAMAccountName, homeDirectory |
Select-Object -Property sAMAccountName, homeDirectory

# Iterate through the hashtable.
$HashTable | ForEach-Object '
{
  # Only process if the home directory has a value.
  if (-not($_.homeDirectory -eq $null)) '
  {
    # Convert the homedir and samaccountname into strings and store in variables.
    [string]$homeDirectory = $_.homeDirectory
    [string]$sAMAccountName = $_.sAMAccountName

    # Extract the servername and the sharename from the homedirectory path.
    [array]$homeDirectorySplit = $homeDirectory -Split [regex]::Escape(‘\’)
    $ServerName = $homeDirectorySplit[2]
    $ShareName = $homeDirectorySplit[3]
    # ...If more levels are needed just keep going.

    # Call the server to get the shares local path.
    $ShareLocalPath = ((Get-WmiObject -ComputerName $ServerName '
                      -Credential $Cred Win32_Share) |
    Foreach-Object { $_.Name -eq $ShareName }).Path

    # Print to a semicolon delimited file.
    "$sAMAccountName;$homeDirectory;$ServerName;$ShareName;$ShareLocalPath" |
    Out-File $CsvFile -NoClobber -Append
  }
}

Se isso fosse um esforço sério, eu adicionaria registro e verificação de erros. Eu otimizaria as chamadas do servidor conforme sugerido acima e faria ping em cada servidor antes de chamá-lo usando Test-Connection . Eu finalmente verificaria o processamento paralelo se os servidores fossem muito numerosos, tudo em nome da confiabilidade, conservação de recursos e velocidade de execução.

    
por 26.06.2015 / 20:38