【问题标题】:List Members of multible AD Groups with more than 5000 Users列出具有超过 5000 个用户的多个 AD 组的成员
【发布时间】:2020-04-01 08:53:23
【问题描述】:

如何获得超过 5000 个用户的多个 AD 组的成员列表 例子: Group1 = 包括 6000 个成员和 Group2 Group2 = 包括 7000 个成员

Group1 的 get-adgroupmember 的结果应该是 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

【问题讨论】:

  • 你可以试试,然后在这里发布你的代码,我们会告诉你哪里出错了。

标签: powershell active-directory


【解决方案1】:

对于这么大的组,它会很慢,但这应该可以满足您的需求:

$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
}

希望有帮助

【讨论】:

  • 你好,坦克需要你的帮助,但在这种情况下,你需要知道所有组的名称,你只知道 group1 的名称并在一个脚本中得到结果
  • @vespavbb 是的,因为您的代码似乎也知道所有组。如果你想找到所有的组,你可以$groups = Get-ADGroup | Select-Object -ExpandProperty SamAccountName。您可能需要先查看Get-ADGroup 的参数,看看是否可以限制返回的组数。
  • Get-ADGroupMember -Recursive 不会遇到默认的 5000 MaxGroupOrMemberEntries ADWS 限制吗?
  • @MathiasR.Jessen 嗯。看着here你可能是对的..
  • 是的,get-ADGroupMember - 递归将不起作用#### 超出此请求的大小限制
【解决方案2】:

最简单的解决方案是在您的目标 DC 上调整 ADWS 中的 MaxGroupOrMemberEntries 参数。您可以查看有关 ADWS 默认值的信息here

您可以执行以下操作,这可能很复杂:

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 正则表达式用于过滤,因此需要构造一个正则表达式匹配字符串。可能有多个组,因此需要使用 |(正则表达式 OR)字符。

[regex]::Escape 方法转义所有可能出现在名称字符串中的反斜杠和其他特殊正则表达式字符。

$output 是包含Members 属性的PSCustomObjects 数组。 Members 属性包含作为用户的所有成员的 DN。


如果不修改 ADWS 默认限制,非 PowerShell 命令可能更适合这种特殊情况。

【讨论】:

  • 好的,谢谢,不错。但是如何修改输出以启用名称 SamAccountname 而不是 cn 路径
  • 那么您需要将Get-ADGroup 命令的结果通过管道传送到Get-ADUser
猜你喜欢
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多