Precisa de ajuda para criar um relatório do powershell

1

Eu tenho uma lista de nomes de computadores e preciso de um relatório de sua UO, seu atributo mangedby e seu nome. Eu criei uma pilha com cada configuração que eu quero, mas eles não estão se alinhando. Para 650 computadores, o atributo count para o managedby e a pilha OU é 650, mas quando eu faço a saída dos dados para um arquivo txt, eu só obtenho 603 linhas do ManagedBy. Isso seria bom se os dados se alinhassem quando os dados combinados, mas em branco, não parecessem alterar a pilha quando eu a adicionei a um arquivo txt. Meu código está abaixo. Depois que eu gero as pilhas, eu as exporto para um arquivo txt onde eu tenho uma macro que pode truncar os dados para mim. Qualquer ajuda seria apreciada.

$stackDN = New-Object System.Collections.Stack
$stackMB = New-Object System.Collections.Stack
$stackNE = New-Object System.Collections.Stack
foreach($computer in $computers){

try{
    Get-ADComputer -Identity $computer -Server $domain -Properties * -ErrorAction Stop
    $object  = Get-ADComputer -Identity $computer -Server $domain -Properties *
    $stackDN.Push($object.DistinguishedName)
    $mb = $object.ManagedBy
    $stackMB.Push($object.ManagedBy)
    $stackMB.push('MB not listed')

}
catch{

$stackNE.Push($computer)
}
} 

$stackDN | Out-File -FilePath H:\dn.txt
$stackMB | out-file -FilePath H:\mb.txt
$stackNE | out-file -FilePath H:\ne.txt'
    
por Mike Eckerle 30.03.2017 / 00:12

1 resposta

3

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.

    
por 30.03.2017 / 07:15