Как я могу подсчитать в доменной среде Windows N пользователей с большим количеством членов группы, чем другие?
Хотелось бы знать как косвенные, так и прямые группы. Итак, я бы хотел, чтобы этот счетчик включал и вложенные группы, поэтому подсчитывайте группы, которые являются членами других групп.
Я нашел еще один вопрос (Powershell - поиск пользователей, принадлежащих более чем к одной группе AD) в ServerFault, но я боюсь, что сценарий из ответа просто дает вам прямое членство для пользователей, а не для вложенных групп.
В доменной среде Windows, как я могу подсчитать первых N пользователей с большим количеством членов группы?
Хотелось бы знать как косвенные, так и прямые группы.
Вложенные методы членства в группах учетных записей пользователей с поддержкой 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
Вывод 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
это для одного пользователя, для любого использования вам может понадобиться сценарий