Eu realizaria a tarefa de maneira semelhante a esta:
- Obtenha os dados do AD em um hashtable.
- Loop, leia o caminho completo do compartilhamento (e os outros campos também, para poder imprimi-los em um novo csv).
- A partir do caminho, saia do servername do nome de compartilhamento usando o método de divisão
- 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. - 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).
- 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.