Há muito ... não convencional ... Powershell em seu código existente. Eu acho que você está tornando as coisas mais difíceis para você do que elas precisam ser. Em particular, usar o objeto Stack do .NET não é necessário e tentar armazenar cada lista em sua própria pilha não é ideal para a organização como você encontrou.
Seu código parece indicar que você já tem uma variável $computers
que contém sua lista de nomes de computadores. Então vamos começar por aí. Você tem a idéia correta sobre a coleção, mas vamos usar o cmdlet ForEach-Object em vez da instrução ForEach. É melhor passar os resultados no pipeline para outros comandos.
$adComputers = $computers | ForEach-Object {
Get-ADComputer $_ -Properties managedBy
}
Existem algumas coisas acontecendo no código acima. O $_
é como você faz referência ao "item atual" no loop ForEach-Object. Também estamos solicitando explicitamente ao AD o atributo managedBy
porque ele não está incluído nos atributos padrão retornados. Nós não especificamos Name
ou DistingiushedName
porque esses são na saída padrão. Mas não faria mal adicioná-los (e alguns argumentariam que é melhor para legibilidade).
Agora que temos nossos objetos de computador em sua própria coleção, vamos fazer um relatório deles. Para dados como este, que são em grande parte apenas um conjunto de linhas e colunas, a saída CSV é geralmente o caminho a percorrer. Nós só precisamos selecionar os atributos específicos que queremos de cada objeto e, em seguida, chamar Export-Csv
.
$adComputers | Select Name,ManagedBy,DistinguishedName |
Export-Csv .\report.csv -NoTypeInformation
Você pode deixar de fora a chamada Export-Csv para visualizar o que estará no CSV. Mas os campos DN provavelmente ficarão truncados, a menos que você esteja usando uma janela realmente ampla. Eu também incluí o -NoTypeInformation
porque ele deixa de fora uma linha de cabeçalho que a maioria das pessoas que visualizam o relatório não se importa.
Tecnicamente falando, você nem precisa dividir esses comandos. Pode ser apenas um grande one-liner como este.
$computers | %{ Get-ADComputer $_ -Prop managedBy } |
Select Name,ManagedBy,DistinguishedName |
Export-Csv .\report.csv -NoTypeInformation
Note que eu mudo o ForEach-Object
para o nome abreviado %
, que é muito mais rápido de digitar na linha de comando. Eu também encurtei -Properties
para -Prop
, o que é suficientemente não-ambíguo para o Powershell saber o que você quer dizer.