Список лучших пользователей в большинстве групп 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
это для одного пользователя, для всего использования вам может понадобиться скрипт