Список лучших пользователей в большинстве групп AD

В доменной среде Windows, как я могу подсчитать N лучших пользователей с большим количеством членов группы, чем другие?

Я хотел бы знать как косвенные, так и прямые группы. Итак, я хотел бы, чтобы этот подсчет включал и вложенные группы, поэтому подсчитайте группы, которые являются членами других групп.

Я нашел другой вопрос ( Powershell - поиск пользователей, принадлежащих к нескольким группам AD) в ServerFault, но я боюсь, что сценарий из ответа просто дает вам прямое членство для пользователей, а не для вложенных групп.

3 ответа

Решение

В доменной среде Windows, как я могу подсчитать N лучших пользователей с большим количеством членов группы?

Я хотел бы знать как косвенные, так и прямые группы.

Количество вложенных групп AD AD

Вложенные методы членства в группе учетных записей пользователей с поддержкой AD могут занимать довольно много времени, поэтому будьте терпеливы, если ваша AD большая (или, возможно, не слишком). Логика Powershell для получения не вложенного членства в группе AD для всех включенных учетных записей пользователей находится ниже вложенной логики, которую я предоставил, если вы хотите запустить их. Источник функции Get-NestedAdGroup Membership

Лучшие 10 записей с наибольшим количеством выводятся на консоль

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

Вывод всех записей в порядке убывания консоли

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

Число не вложенных групп AD

Лучшие 10 записей с наибольшим количеством выводятся на консоль

$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

Вывод всех записей в порядке убывания консоли

$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

Заметки

Во всех приведенных выше логических примерах у меня есть синтаксис Get-ADUser -Filter {Enabled -eq $True} в Get-ADUser команда, поэтому этот фильтр позволяет убедиться, что вы запрашиваете только объект учетной записи пользователя ENABLED AD. Это означает, что ОТКЛЮЧЕННЫЕ учетные записи НЕ будут включены в результаты, если этот фильтр не будет удален или изменен.

Вышеприведенные примеры ВСЕ были протестированы и подтверждены для работы, как и ожидалось, в моем случае, так что все они были проверены на успешную работу.


Потенциальные проблемы

Если вы столкнулись с проблемой с сообщением об ошибке "Сервер не смог обработать запрос из-за внутренней ошибки в Powershell при выполнении этих процессов выше", вы можете обратиться к этой статье, чтобы найти потенциальное решение, которое работает в мой случай (нажмите на предоставленную ссылку).


Дальнейшее чтение и ресурсы

Моя среда намечена для обновления, поэтому я не могу проверить это, но что-то вроде

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

может сделать свое дело.

Для отображения списка групп с вложенными группами

dsget user "cn = Jon Smith, cn = users, dc = microsoft, dc = com" -memberof -expand

dsquery имя пользователя "Джон Смит" | dsget user -memberof -expand

это для одного пользователя, для всего использования вам может понадобиться скрипт

Другие вопросы по тегам