Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

Вывод 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 команда, поэтому эта фильтрация гарантирует, что вы только запрашиваете ВКЛЮЧЕНО Объект учетной записи пользователя 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-memberof -expand

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