Самое простое решение - настроить параметр MaxGroupOrMemberEntries
в ADWS на D C, на который вы нацеливаетесь. Вы можете увидеть информацию о значениях по умолчанию ADWS здесь .
Вы могли бы сделать что-то вроде следующего, что может оказаться запутанным:
function Get-ADGroupMembers
{
param ($groupname)
Get-ADGroupMember $groupname | where ObjectClass -eq 'Group' | ForEach-Object {
$_.Name
Get-ADGroupMembers $_.Name
}
}
$maingroup = 'group1'
$subgroups = Get-ADGroupMembers $maingroup
$allGroups = @($maingroup)+@($subgroups)
$regexEscapes = $allGroups |% { [regex]::Escape($_) }
$filter = "CN=({0})" -f ($regexEscapes -join "|")
$output = foreach ($group in $allGroups) {
Get-AdGroup $group -Properties Members | Select @{n='Members';e={$_.Members -notmatch $filter}}
}
$output.Members
Объяснение:
Функция выведет список значений свойства Name
для каждой рекурсивно обнаруженной группы членов.
Поскольку в фильтрации используется оператор регулярного выражения -notmatch
, необходимо создать строку соответствия регулярному выражению. , Может быть несколько групп, поэтому необходимо использовать символ |
(regex OR).
Метод [regex]::Escape
экранирует все обратные слеши и другие специальные символы регулярных выражений, которые могут появляться в строках имени.
$output
- это массив PSCustomObject
s, содержащий свойство Members
. Свойство Members
содержит DN всех членов, которые являются пользователями.
Команды, отличные от PowerShell, могут лучше подходить для этого конкретного случая, если ограничения ADWS по умолчанию не изменены.