Составить список членов групп AD с более чем 5000 пользователями - PullRequest
0 голосов
/ 01 апреля 2020

Как я могу получить список участников в многопользовательских группах AD с более чем 5000 пользователей Пример: Group1 = включает в себя 6000 участников и Group2 Group2 = включает в себя 7000 участников

результат get-adgroupmember Group1 должен 13000

как я могу это сделать? Здесь у меня есть проблема, что он не будет смотреться в рекурсивных подгруппах, не будет работать с get-adgroup

$group = "group1"
$ADInfo = Get-ADGroup -Identity $Group -Properties Members 
$outputfile = $group
$ADInfo.Members | get-aduser | Select name, enabled, UserPrincipalName, SamAccountName  

#$ADInfo.Members | get-aduser | Select name, enabled, UserPrincipalName, SamAccountName  | Export-Csv c:\temp\$outputfile-member.csv -Delimiter "," -NoTypeInformation

# to show output
$members = @()
$members = $ADInfo.members
$members.count

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Самое простое решение - настроить параметр 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 по умолчанию не изменены.

0 голосов
/ 01 апреля 2020

С такими большими группами это будет медленно, но это должно делать то, что вы хотите:

$groups = 'group1', 'group2'  # array of group names

foreach ($group in $groups) {
    Write-Host "Working on group '$group'"
    $result = Get-ADGroupMember -Identity $group -Recursive | Where-Object { $_.objectClass -eq 'user' } | ForEach-Object {
        Get-ADUser -Identity $_.distinguishedName | Select-Object Name, Enabled, UserPrincipalName, SamAccountName
    }
    # show result on screen
    $result | Format-Table -AutoSize

    # write to export file
    $result | Export-Csv -Path "c:\temp\$group-members.csv" -NoTypeInformation
}

Надеюсь, это поможет

...