使用Powershell获取所有AD用户的递归组成员身份

时间:2014-05-27 09:00:56

标签: powershell recursion membership active-directory-group

我试图创建一个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。

我应该在第一个脚本中添加什么来递归写入组成员资格?

5 个答案:

答案 0 :(得分: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
}

现在,根据您的AD结构的大小可能需要一段时间,但它会为您提供所需的内容。

答案 1 :(得分:1)

这很容易。只需使用ActiveRoles Management Shell for Active Directory即可。带有参数间接的Cmdlet Get-QADMemberOf 是您要查找的。例如:

Get-QADMemberOf john.smith -Indirect

答案 2 :(得分:1)

返回的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

答案 3 :(得分: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
    }
}

答案 4 :(得分:1)

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

示例:Get-ADGroupMember -Identity My_Group -Recursive