PowerShell e gerenciamento de usuários do Active Directory

1

Problema: Obtenha uma lista de nomes de usuários de um arquivo CSV e remova-os recursivamente de todos os grupos de usuários dos quais são membros. Eu gostaria de limitar quais grupos eles são removidos com base em um prefixo para o nome do grupo.

Exemplo: Se user_bob (um dos muitos nomes de usuário no CSV) era membro dos seguintes grupos (determinado recursivamente): abc-users, abc-printers, abc-users-limited xzy-users, xyz-secure, então eu gostaria que o script do PowerShell o removesse de todos os grupos que são prefixados com "abc-" e depois passem para o próximo nome de usuário no CSV e executem o mesmo processo.

Notas: Eu tenho procurado por todo o site on-line por exemplos de algo assim e não consigo localizar nenhuma pista. Fragmentos de código ou amostras com as quais posso iniciar o processo de teste ou reunião em uma solução seriam muito apreciados. Eu tenho procurado na documentação do TechNet para os commandlets e não tenho feito muito progresso. Obrigado antecipadamente!

    
por John 07.09.2011 / 21:10

2 respostas

5

O algoritmo base do que você está procurando é algo assim (de qualquer forma, de acordo comigo):

  1. Enumere todo o grupo com o prefixo certo.
  2. Seguir de forma recursiva seus membros do grupo para enumerar todos os grupos aninhados neles.
    1. Depois de obter um grupo sem grupos como membros, pare de recursar.
  3. Pegue a lista de usuários para cada usuário
    1. Enumere suas participações no grupo
    2. Se algum deles tiver o prefixo correto, remova-o dele.
    3. Se algum dos grupos restantes estiver na lista de grupos enumerados na etapa principal anterior, remova-os dessa lista também.

Agora, para coisas semelhantes a códigos reais.

Enumerando todos os grupos com um prefixo (não testado, haverá bugs):

$RecurseList=dsquery group -name "abc-*"
$TargetList=$RecurseList
foreach $Grp in $RecurseList {
    # Now get the members of that group, do not expand
    $GrpMembers=dsget group "$Grp" -members
    foreach ($Member in $GrpMembers) {
        $isGroup=dsget group $Member
        if ($isGroup.dn -eq $Member) {
            $TargetList.add("$Member")
            RecurseIntoGroup($isGroup.dn)
        }
    }
}

Então, quando chegar a hora de falar sobre a lista de CSV, obtenha a associação do usuário e verifique se esse grupo existe em $ TargetList acima. Em caso afirmativo, remova-o.

Este é um monte de trabalho a ser feito ao remover apenas um usuário de potencialmente milhares de grupos, mas se você fizer MUITOS, a lista pré-criada economizará seu tempo.

Se você só precisa fazer isso para alguns usuários (digamos, 10 ou mais), você pode voltar a subir na árvore.

$UserGroups = dsquery user -name $Username -memberof
foreach ($uGroup in $UserGroups) {
    if (isConcerning($uGroup)) {
        $ConcerningGroups.add("$uGroup")
    }
}

function isConcerning {
param ($uGroup)

$parentGroups=dsget group $uGroup -memberOf
$found=$False
foreach ($pg in $parentGroup) {
    if ($parentGroup.startswith("abc-")) {
    return($true)
    $found=$true
    } else {
        $concerning=isConcerning($pg)
        if ($concerning) {
            return($true)
            $found=$true
        } 
    }
}
if (-not $found) {
    return($False)
}

Em seguida, remova os grupos relacionados, conforme necessário.

    
por 07.09.2011 / 22:08
5

Assumindo que você deseja remover TODOS os usuários de todos os grupos com o prefixo específico, não com base em nenhum outro critério (por exemplo, remover usuários abc de grupos xyz e usuários xyz de grupos abc). Então você poderia fazer assim. Alguns pontos antes:

  1. Qual formato são os nomes de usuários no seu arquivo CSV? Isso determinará como você procura o usuário, você precisará atualizar o parâmetro adequadamente (por exemplo, alterar $user.Identity para $user.SAMAccountName )
  2. Isso requer os cmdlets do AD Powershell, portanto você precisa importar o módulo AD primeiro (ou executá-lo no console do AD Powershell em um DC ou em um computador com as ferramentas administrativas instaladas)
  3. Os itens a seguir só funcionarão para associação de grupo direta, não para associação a grupo recursivo.

$prefix = "CN=abc-*"

$userlist = Import-CSV userlist.csv

foreach ($user in $userlist) { $currentuser = Get-ADUser $user.Identity -properties memberof $grouplist = $currentuser.memberof

foreach ($group in $grouplist) { if ($group -like $prefix) { Get-ADGroup $group | Remove-ADGroupMember -members $currentuser -Confirm:$false } } }

Se você precisar pesquisar recursivamente, precisará tentar outra coisa. você poderia dar uma olhada no item 11. em este post para ver se isso ajuda.

    
por 08.09.2011 / 00:59