【问题标题】:Get recursive group membership of all AD users using Powershell使用 Powershell 获取所有 AD 用户的递归组成员身份
【发布时间】:2014-05-27 09:00:55
【问题描述】:

我正在尝试制作一个 PS 脚本,它会列出所有 Active Directory 用户组成员身份(递归)。

我已经有了工作脚本:

import-module activedirectory

$users = get-aduser -Filter {Name -Like "*"} -Searchbase "ou=Users, dc=Domain" | Where-Object { $_.Enabled -eq 'True' } 

$targetFile = "D:\users.csv"
rm $targetFile
Add-Content $targetFile "User;Group"


foreach ($user in $users)
{
    $groups = Get-ADPrincipalGroupMembership $user

    foreach ($group in $groups)
    {
        $username = $user.samaccountname
        $groupname = $group.name
        $line = "$username;$groupname"
        Add-Content $targetFile $line
    }
}

但脚本不会递归地列出组,即,如果输出文件中列出的组是另一个组的一部分。

例子:

组 1:用户

组 2:组 3:用户

脚本仅显示 Group1 和 3,但不显示 2。

我应该在第一个以递归方式编写组成员身份的脚本中添加什么?

【问题讨论】:

  • 您应该递归查询Get-ADPrincipalGroupMembership 的组,对于那些您尚未查询的组。

标签: powershell recursion membership active-directory-group


【解决方案1】:

抱歉,我发布了 3 年前问题的答案,但如果有人会看到它,它会有所帮助。
致:
How to get ALL AD user groups (recursively) with Powershell or other tools?

您可以使用LDAP_MATCHING_RULE_IN_CHAIN

Get-ADGroup -LDAPFilter "(member:1.2.840.113556.1.4.1941:=CN=User,CN=USers,DC=x)"

您可以在任何可以使用 LDAP 过滤器的地方使用它。

示例:

$username = 'myUsername'
$dn = (Get-ADUser $username).DistinguishedName
Get-ADGroup -LDAPFilter ("(member:1.2.840.113556.1.4.1941:={0})" -f $dn) | select -expand Name | sort Name  

修正你的脚本:

import-module activedirectory

$users = get-aduser -Filter {Name -Like "*"} -Searchbase "ou=Users, dc=Domain" | Where-Object { $_.Enabled -eq 'True' } 

$targetFile = "D:\users.csv"
rm $targetFile
Add-Content $targetFile "User;Group"

foreach ($user in $users)
{
$dn = $user.DistinguishedName
    $groups = Get-ADGroup -LDAPFilter ("(member:1.2.840.113556.1.4.1941:={0})" -f $dn) | select -expand Name | sort Name

    foreach ($group in $groups)
    {
        $username = $user.samaccountname
        $groupname = $group.name
        $line = "$username;$groupname"
        Add-Content $targetFile $line
    }
}

【讨论】:

    【解决方案2】:

    如果你把它变成一个函数,你可以递归地调用它。看看这个,我想你会对结果感到满意:

    Function Get-ADGroupsRecursive{
    Param([String[]]$Groups)
        Begin{
            $Results = @()
        }
        Process{
            ForEach($Group in $Groups){
                $Results+=$Group
                ForEach($Object in (Get-ADGroupMember $Group|?{$_.objectClass -eq "Group"})){
                    $Results += Get-ADGroupsRecursive $Object
                }
            }
        }
        End{
            $Results | Select -Unique
        }
    }
    

    将它放在脚本的顶部,然后为每个用户调用它。比如:

    import-module activedirectory
    
    $users = get-aduser -Filter {Name -Like "*"} -Searchbase "ou=Users, dc=Domain" -Properties MemberOf | Where-Object { $_.Enabled -eq 'True' } 
    
    $targetFile = "D:\users.csv"
    rm $targetFile
    Add-Content $targetFile "User;Group"
    
    
    foreach ($user in $users)
    {
        $Groups = $User.MemberOf
        $Groups += $Groups | %{Get-ADGroupsRecursive $_}
    $Groups | %{New-Object PSObject -Property @{User=$User;Group=$_}}|Export-CSV $targetfile -notype -append
    }
    

    现在,根据您的广告结构的大小,这可能需要相当长的时间,但它会为您提供所需的内容。

    【讨论】:

    • 感谢您提供的代码。但我收到错误“‘Get-ADGroupsRecursive’一词未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。”
    • 那么您没有将我提供的函数放在脚本的顶部,而是尝试运行我在它之前或完全没有它提供的函数的第二部分。
    • 你是对的,现在这部分工作了。但我在附加部分出现错误。
    • 也许您应该用您正在使用的内容更新您的问题,并发布您此时遇到的错误。
    • $Groups | %{New-Object PSObject -Property @{User=$User;$Group=$_}}|Export-CS .. 处的空键无效
    【解决方案3】:

    这很容易。只需使用ActiveRoles Management Shell for Active Directory。带有参数 Indirect 的 Cmdlet Get-QADMemberOf 是您正在寻找的那个。示例:

    Get-QADMemberOf john.smith -Indirect

    【讨论】:

      【解决方案4】:

      返回的 Quest 对象已在属性$_.AllMembers 中包含所有递归组(和一级用户)

      Add-PSSnapin Quest.ActiveRoles.ADManagement
      $UsersFirstLevel = ($Members | Get-QADObject -Type Group -DontUseDefaultIncludedProperties | Get-QADGroupMember -DontUseDefaultIncludedProperties | ?{$_.type -eq 'user'})
      $UsersSubGroup = ($Members | Get-QADObject -Type Group -DontUseDefaultIncludedProperties | Get-QADGroupMember -DontUseDefaultIncludedProperties | ?{$_.type -eq 'group'}).Allmembers | Get-QADObject -DontUseDefaultIncludedProperties | ?{$_.type -eq 'user'}
      
      $RecursiveUsers = $UsersFirstLevel
      $RecursiveUsers += $UsersSubGroup
      $RecursiveUsers = $RecursiveUsers | Sort-Object -Unique
      

      【讨论】:

        【解决方案5】:

        较新版本的 PowerShell(AD 模块)确实有 -Recursive 开关。所以你可以轻松使用Get-ADGroupMember

        示例:Get-ADGroupMember -Identity My_Group -Recursive

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          • 2016-10-26
          • 2014-06-26
          相关资源
          最近更新 更多