Listar os principais usuários no maior número de grupos do AD

3

Em um ambiente de domínio do Windows, como eu poderia contar os principais N usuários com mais membros do grupo do que outros?

Eu gostaria de conhecer os grupos indiretos e diretos. Então, eu gostaria que essa contagem incluísse os grupos aninhados, então conte os grupos que são membros de outros grupos.

Eu encontrei outra pergunta ( Powershell - Encontre usuários pertencentes a mais de um grupo AD dentro do ServerFault, mas temo que o script da resposta apenas forneça a você a associação direta para os usuários e não para os grupos aninhados.

    
por fedayn 14.01.2016 / 10:39

3 respostas

2

In a Windows domain environment, how could I count the top N users with more groupmembership?

I'd like to know both the indirect and direct groups.

Contagens de membros do grupo do AD aninhadas

Os métodos aninhados de associação de grupo de conta de usuário habilitados para o AD podem levar algum tempo, por isso, seja paciente se o seu AD for grande (ou talvez não muito). A lógica do Powershell para obter a associação do grupo do AD não aninhada para todas as contas de usuário ativadas está abaixo da lógica aninhada que forneci, se você quiser executá-las. Get-NestedAdGroupMembershipFunção de função

Os 10 maiores registros de contagem de saída para o console

function Get-NestedAdGroupMembership {

Param(
    [parameter(Mandatory=$true)]
    [alias("account", "username")]
        $user,
    [parameter(Mandatory=$false)]
    $grouphash = @{}
    )

   $groups = @(Get-ADPrincipalGroupMembership -Identity $user | select -ExpandProperty distinguishedname)
   foreach ($group in $groups) {
      if ( $grouphash[$group] -eq $null) {
         $grouphash[$group] = $true
         $group
         Get-NestedAdGroupMembership $group $grouphash
      }
   }
}


$TempDir    = $env:Temp
$TempPSFile = "$TempDir\~PSTempADMembershipCount.lst"
$Users = Get-ADUser -Filter {Enabled -eq $True} | Select-Object sAMAccountName

If (Test-Path $TempPSFile){
    Remove-Item $TempPSFile
}

ForEach ($User in $Users){
$SamName = $User.sAMAccountName
$Count = Get-NestedAdGroupMembership $User.sAMAccountName | Measure-Object | Select-Object -Expand Count
"$SamName,$count" | Out-File -Filepath $TempPSFile -Append
}

Import-Csv -Header Username,GroupCount -Path $TempPSFile | Sort-Object {[int] $_.GroupCount} -Descending | Select-Object -First 10

Saída de todos os registros para o pedido decrescente do console

function Get-NestedAdGroupMembership {

Param(
    [parameter(Mandatory=$true)]
    [alias("account", "username")]
        $user,
    [parameter(Mandatory=$false)]
    $grouphash = @{}
    )

   $groups = @(Get-ADPrincipalGroupMembership -Identity $user | select -ExpandProperty distinguishedname)
   foreach ($group in $groups) {
      if ( $grouphash[$group] -eq $null) {
         $grouphash[$group] = $true
         $group
         Get-NestedAdGroupMembership $group $grouphash
      }
   }
}


$TempDir    = $env:Temp
$TempPSFile = "$TempDir\~PSTempADMembershipCount.lst"
$Users = Get-ADUser -Filter {Enabled -eq $True} | Select-Object sAMAccountName

If (Test-Path $TempPSFile){
    Remove-Item $TempPSFile
}

ForEach ($User in $Users){
$SamName = $User.sAMAccountName
$Count = Get-NestedAdGroupMembership $User.sAMAccountName | Measure-Object | Select-Object -Expand Count
"$SamName,$count" | Out-File -Filepath $TempPSFile -Append
}

Import-Csv -Header Username,GroupCount -Path $TempPSFile | Sort-Object {[int] $_.GroupCount} -Descending | Select-Object

Contagens de membros do grupo do AD não aninhadas

Os 10 maiores registros de contagem de saída para o console

$TempDir    = $env:Temp
$TempPSFile = "$TempDir\~PSTempADMembershipCount.lst"
$Users = Get-ADUser -Filter {Enabled -eq $True} | Select-Object sAMAccountName

If (Test-Path $TempPSFile){
    Remove-Item $TempPSFile
}

ForEach ($User in $Users){
$SamName = $User.sAMAccountName
$Count = Get-ADPrincipalGroupMembership $User.sAMAccountName | Measure-Object | Select-Object -Expand Count
"$SamName,$count" | Out-File -Filepath $TempPSFile -Append
}

Import-Csv -Header Username,GroupCount -Path $TempPSFile | Sort-Object {[int] $_.GroupCount} -Descending | Select-Object -First 10

Saída de todos os registros para o pedido decrescente do console

$TempDir    = $env:Temp
$TempPSFile = "$TempDir\~PSTempADMembershipCount.lst"
$Users = Get-ADUser -Filter {Enabled -eq $True} | Select-Object sAMAccountName

If (Test-Path $TempPSFile){
    Remove-Item $TempPSFile
}

ForEach ($User in $Users){
$SamName = $User.sAMAccountName
$Count = Get-ADPrincipalGroupMembership $User.sAMAccountName | Measure-Object | Select-Object -Expand Count
"$SamName,$count" | Out-File -Filepath $TempPSFile -Append
}

Import-Csv -Header Username,GroupCount -Path $TempPSFile | Sort-Object {[int] $_.GroupCount} -Descending

Notas

Em todos os exemplos lógicos acima, eu tenho a sintaxe de Get-ADUser -Filter {Enabled -eq $True} no comando Get-ADUser , então isso filtra para garantir que você esteja consultando apenas o objeto da conta de usuário do ENABLED AD. Isso significa que as contas DISABLED NÃO serão incluídas nos resultados, a menos que esse filtro seja removido ou alterado.

Os exemplos acima têm ALL sido testado e confirmado para funcionar como esperado no meu caso, então todos foram verificados para funcionar com sucesso.

Problemas potenciais

Se você tiver um problema com uma mensagem de erro de O servidor não pôde processar a solicitação devido a um erro interno no Powershell ao executar esses processos acima, então você pode querer dar uma olhada neste artigo para uma solução potencial que funcionou no meu caso (clique no link fornecido).

Leitura adicional e recursos

por 16.01.2016 / 06:14
0

Para exibir a lista de grupos com grupos aninhados

usuário dsget "cn = Jon Smith, cn = usuários, dc = microsoft, dc = com" -memberof -expand

dsquery user -name "Jon Smith" | dsget user -memberof -expand

isto é para um único usuário, para todo o uso você pode precisar de um script

    
por 14.01.2016 / 13:15
0

Meu ambiente está escalado para atualização, então não posso testar isso, mas algo como

Get-ADUser -Filter * -Properties memberOf | Where-Object {$_.memberof.count -ge 1} | Sort-Object -Property $_.memberof.count -Descending | Select-Object -First 10

pode fazer o truque.

    
por 15.01.2016 / 18:41