我试图创建一个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。
我应该在第一个脚本中添加什么来递归写入组成员资格?
答案 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