Powershell para adicionar usuários a um grupo

2

Eu escrevi este bit de PS para adicionar usuários de um arquivo de texto ao grupo AD que o usuário insere. Ele funciona bem, exceto pela instrução if . A declaração if deve verificar o grupo para ver se os usuários no arquivo de texto já são membros do grupo. Então, a variável $item é inicializada com 'jdoe' e a variável $member é inicializada da seguinte forma:

$member=Get-ADGroupMember -identity $group | select SamAccountName

O membro do problema será inicializado com @{SamAccountName=JDoe} , @{SamAccountName=bsmith} , etc. Basicamente, todos os membros em uma única falha e encapsulados com os dados adicionais, obscurecendo assim os dados usados para a comparação. Aqui está o meu código na sua totalidade. Eu apreciaria qualquer ajuda. Obrigado

#User input group name
$group=read-host -prompt "Enter group name:"

#Loop through each item in text file
foreach ($item in Get-Content C:\addusers.txt) {
    #If user is already a member of group...
    $member = Get-ADGroupMember -identity $group | select SamAccountName
    if ($member -eq $item) {
         Write-Host $item "is already a member of" $group
    }

    #add to group
    Add-ADGroupMember -Identity $group -Member $item
}
    
por user179037 14.08.2013 / 19:48

1 resposta

4

O primeiro problema é a sua comparação. A linha que atribui um valor a $ member retorna uma lista, não um único item. Então você está basicamente perguntando no teste "se essa lista grande é igual a um único item". Essa condição nunca será verdadeira, exceto, talvez, o grupo tenha apenas um membro (não tenho certeza se você obterá um único item nesse caso ou um objeto de matriz com um membro).

A segunda questão é que você não faz nada com os resultados deste teste - você ainda executa a adição do grupo mesmo que o usuário já esteja no grupo (supondo que seu teste foi escrito corretamente). Por quê?

Ele também tem muita sobrecarga, já que ele executará esse despejo do conteúdo do grupo toda vez que você executá-lo. Melhor seria obter os membros do grupo uma vez, fora de seu loop foreach, e então usar uma busca de array nessa lista dentro do loop foreach. Isso é menos preocupante, mas pode valer a pena consertar.

PS - você pode adicionar um usuário a um grupo, mesmo que ele já seja membro do grupo. Então você pode querer remover essa comparação completamente:

foreach ($user in get-content $userspath) {
    Add-ADGroupMember -Identity $group -Member $user
}

Editar: Se você ainda quiser pesquisar a existência de um membro no grupo, poderá fazer assim:

$u = get-aduser $user -properties "memberof"
if ($u.memberOf -contains (get-adgroup $group) ) 
    ...
    
por 14.08.2013 / 20:33