Получить все пустые группы в Active Directory
Я застрял, пытаясь выяснить, как получить все группы Active Directory, которые пусты. Я придумал эту команду, которая выбирает группы, которые не имеют членов и не являются членами ничего.
Get-QADGroup -GroupType Security -SizeLimit 0 | where-object {$_.Members.Count -eq 0 -and $_.MemberOf.Count -eq 0} | select GroupName, ParentContainer | Export-Csv c:\emptygroups.csv
Это в основном правильно, но в нем говорится, что определенные группы, такие как группа по умолчанию Domain Domain, пустые, но не пустые. В этой конкретной группе есть только участники, которые являются компьютерами, но, похоже, что другие группы, в которых есть только компьютеры, не выбраны.
Кто-нибудь знает, почему эта команда тянет тех, у кого есть участники?
5 ответов
Get-QADGroup
Командлет имеет параметр -Empty
, Описание в справке подсказывает причину возврата этих групп по умолчанию:
Примечание. Группа считается пустой, если для нее не задан атрибут "member". Таким образом, этот параметр может извлекать группу, в которой есть только те члены, для которых группа установлена в качестве основной группы. Примером является группа "Пользователи домена", которая обычно является основной группой для любой учетной записи пользователя, хотя атрибут "member" не установлен.
Я не очень знаком с квестами, но я смог найти пустые группы таким образом (вероятно, не самый эффективный):
Get-ADGroup -Filter {GroupCategory -eq 'Security'} | ?{@(Get-ADGroupMember $_).Length -eq 0}
Эта строка будет делать (используйте Import-Module ActiveDirectory
первый):
Get-ADGroup -Filter * -Properties Members | where { $_.Members.Count -eq 0 }
Эта версия будет отображать только групповую категорию и SAMaccountname. Имя также может быть использовано вместо samaccountname. Групповая категория покажет вам, если это группа безопасности или DL.
Get-ADGroup –Filter * -Properties Members | where { $_.Members.Count –eq 0 } |select groupcategory,samaccountname >c:\temp\nomembers.csv
На самом деле это будет потеряно быстрее в средах с несколькими доменами, большим количеством групп (и большим количеством пользователей), чтобы запускать его как скрипт. Примечание. Вам потребуется загрузить модуль каталогов PowerShell Active (каталог-каталога-import-module)
$domains = Get-ADForest|select -ExpandProperty domains
$empties = @()
$oops = @()
foreach ($d in $domains){
$groups = get-adgroup -filter * -server $d
foreach ($g in $groups){
$q = get-adgroup $g -properties members -server $d|select -expandproperty members
If(!$?){$oops += $g
write-host $g.name}
if ($q -eq $null) {$empties += $g}
}
}
$empties|select name,distinguishedname|export-csv .\empties.csv
$oops|select name,distinguishedname|export-csv .\oops.csv
Это сработало для меня.
Get-ADGroup -Filter {GroupCategory -eq 'Security'} -Properties Members | where { $_.Members.Count -eq 0 } | Select Name | Sort-Object Name
Был в состоянии получить значения правильно, по трубопроводу Get-QADGroupMember
и получение количества членов и MemberOf, которые затем могут быть отфильтрованы. Это кажется ужасно неэффективным, но оно служит цели для получения необходимого количества.
Get-QADGroup -SizeLimit 0 | Select-Object Name,@{n='MemberCount';e={ (Get-QADGroupMember $_ -SizeLimit 0 | Measure-Object).Count}},@{n='MemberOfCount';e={ ((Get-QADGroup $_).MemberOf | Measure-Object).Count}}
Если у кого-то есть лучший способ сделать это, скажите.