Script do Powershell: Loop / Array não recupera todas as informações do AD Get Commands: erro “não é possível definir a identidade do parâmetro”

2

Eu tenho um script powershell que faz um loop e recupera informações do AD usando comandos get. No momento, ele está recuperando as informações selecionadas para o nome da conta e o nome distinto. Mas se eu adicionar outro parâmetro / propriedade, por exemplo membros ou nome completo não está recuperando essa informação. Como faço para superar isso, pois quero recuperar mais informações sobre o usuário e o nome do domínio:

    $GrpArr = @()
$Groups = get-adgroup -filter '*' -SearchBase "DC=hp,DC=dlink,DC=com" -ErrorAction "Silentlycontinue"| select samaccountname, DistinguishedName, GroupName, Name
foreach ($group in $groups)
{
$GrpArr += $group
$members = get-adgroupmember $group | select samaccountName, DistinguishedName, GroupName, Name
foreach ($member in $members)
{

    $GrpArr += $member
#$GrpArr += $domain

}
}
$GrpArr | Export-csv -ErrorAction "Silentlycontinue" -Path C:\Output.csv -NoTypeInformation
    
por user3772927 27.06.2014 / 14:21

2 respostas

1

Aqui está uma explicação mais precisa do que está acontecendo:

Esse erro significa que o parâmetro Identidade , que é o primeiro parâmetro posicional dos comandos Get-AD * , tem um tipo inválido. Em geral, é uma boa ideia incluir mensagens de erro exatas e completas, mas neste caso, vejo apenas um comando com um parâmetro Identidade , Get-ADGroupMemeber , e você está fornecendo $ group como a identidade.

O problema é que $ group não é um tipo de objeto que o parâmetro Identidade de Get-ADGroupMember possa aceitar. Por quê? Porque, embora a propriedade Identidade possa aceitar objetos ADGroup e Get-ADGroup retorne uma matriz de objetos ADGroup, Select-Object retorna uma matriz de PSCustomObjects com NoteProperties correspondente às propriedades selecionadas. Então, canalizando a saída de Get-ADGroup através de select , você está atribuindo uma matriz de PSCustomObjects para $ Groups e em cada iteração do loop foreach você está fornecendo um membro dessa matriz como o argumento Identidade , daí o erro.

Esse é o problema. A solução depende do que você está tentando realizar, o que não está totalmente claro.

Você pode resolver o erro simplesmente movendo | select [...] da instrução Get-ADGroup na segunda linha para a linha $GroupArr += $group , como sugerido na resposta de Tim Ferrill. No entanto, não acho que isso lhe dará os resultados desejados, por dois motivos:

  1. Você está combinando resultados de diferentes tipos de objetos no mesmo arquivo CSV. Get-ADGroup retorna objetos ADGroup e Get-ADGroupMembers retorna objetos ADPrincipal (que podem representar objetos de usuário, computador ou grupo). Assim, o arquivo CSV terá, para cada grupo, uma linha representando o grupo seguido de linhas representando cada membro desse grupo.

    Talvez seja isso o que você quer, mas suspeito que não, porque esse é um conjunto de dados ímpares para representar em um arquivo CSV, já que geralmente arquivos CSV não devem ser solicitados, e não há nada nos dados que faça a distinção entre linhas representando grupos e linhas representando membros do grupo. Além disso, se você tiver grupos aninhados, terá entradas duplicadas, porque qualquer grupo que seja membro de qualquer outro grupo será listado uma vez como um grupo e uma vez para cada grupo do qual ele é membro.

  2. Não há nenhuma propriedade "GroupName", no Active Directory ou nos objetos retornados pelos comandos Get-AD * . O valor da propriedade GroupName em cada PSCustomObject retornado por suas instruções select seria um ADPropertyValueCollection vazio, que seria exibido no formato de tabela como {} (símbolo de coleção vazia) e no arquivo CSV como "Microsoft.ActiveDirectory.Management.ADPropertyValueCollection" .

    Acho que é uma suposição segura que você não deseja que o arquivo CSV tenha uma coluna que contenha exatamente o mesmo valor sem sentido para cada entrada. Além disso, logicamente não faz sentido para mim querer uma coluna GroupName nas entradas que representam grupos quando você já tem uma coluna Name, porque, para essas entradas, Name conteria o nome do grupo.

Se eu tivesse que adivinhar, eu diria que o que você quer é um arquivo CSV com uma linha representando cada membro do grupo, com colunas para as propriedades sAMAccountName, distinguishedName e name do membro, e uma coluna GroupName contendo o nome de o grupo do qual ele é membro (o que significaria que, para entidades de segurança que são membros de vários grupos, haveria várias entradas, cada uma com um GroupName diferente).

No entanto, isso é apenas uma inferência. Se você puder ser mais específico sobre o tipo de saída que está procurando, posso explicar como conseguir isso.

    
por 09.07.2014 / 00:50
0

Duas linhas precisam ser alteradas. O primeiro passo é retornar os objetos do grupo em vez dos únicos campos certos (é por isso que você está recebendo esse erro):

 $Groups = get-adgroup -filter '*' -SearchBase "DC=hp,DC=dlink,DC=com" -ErrorAction "Silentlycontinue"

Em seguida, adicione apenas os campos de que você precisa ao array (isso fornece as informações que você estava recuperando originalmente):

$GrpArr += $group | select samaccountname, DistinguishedName, GroupName, Name

Tudo o mais deve funcionar como está.

    
por 27.06.2014 / 16:57

Tags