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).