Получить все пустые группы в 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}}

Если у кого-то есть лучший способ сделать это, скажите.

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