我已经开始建立如下群组:
- 部门人员
- 部门主管
- 系主任
- 部门主管
其中,部门主管是部门职员的成员,部门主任是部门主管的成员。
我知道如何使用 powershell 列出一个人所属的组,无论是直接分配的,还是通过嵌套组继承的。
但我想弄清楚的是一个脚本,它可以向我显示直接和间接属于其中一个组的所有用户,例如,用户 A 是部门职员和部门主管的直接成员。
我通过谷歌搜索尝试找到或编写一个可以做到这一点的脚本,但没有成功。
编辑:
实际上,嵌套的层次和分支更多,部门也更多,因此会让人感到困惑。我想获取直接属于任何组的成员列表,以及间接属于同一组的成员,这样我就可以删除冗余的组直接成员资格。
答案1
下面的代码将遍历给定的父组(名称必须与语法兼容Get-ADGroupMember
)并填充两个哈希。一个哈希将以用户 sAMAccountName 作为键,以及一个数组直接的组成员身份作为值。第二个哈希将包含所有已处理组的键。
它将正确检测并跳过循环组嵌套(例如父级是子级的子级)。您可以注释掉这些Write-Host
行以减少控制台中的行噪音。
Import-Module ActiveDirectory
function Walk-Group ( $group ) {
Get-ADGroupMember $group | Group-Object objectClass -ash | Foreach-Object {
# Add each user to $users hash, add current group to their collection
if ( $_.user ) {
foreach ( $u in $_.user.GetEnumerator() ) {
if ( $users[$u.sAMAccountName] ) {
$users[$u.sAMAccountName] += $group
} else {
$users.Add( $u.sAMAccountName, @($group) )
}
}
}
# Recurse into each child group, skip if group is circular member
if ( $_.group ) {
foreach ( $g in $_.group.GetEnumerator() ) {
if ( $groups[$g.Name] ) {
Write-Host "Existing:" $g.Name
} else {
Write-Host "New Group:" $g.Name
$groups.Add( $g.Name, $true )
Walk-Group $g.Name
}
}
}
}
}
# Hash to collect user/group info.
$users = @{}
# Hash to collect processed groups.
$groups = @{}
# Root group to walk
Walk-Group "Department-staff"
# Display users with mulitple direct memberships
$users.GetEnumerator() | Where-Object { $_.Value.Count -gt 1 }
答案2
编辑:根据您更新的描述,类似这样的方法应该可行。请注意,我没有处理组成员身份中的循环,因此您可能会发现它永远运行下去。
$RootGroup=Get-ADGroup "your group here"
$username = "test user here"
Function RecurseMembership( $FromAbove, $username )
{
"------------------------------------------------------"
$FromAbove
$LevelUsers=$FromAbove | Get-ADGroupMember | where { $_.objectClass -eq "user" -and $_.SamAccountName -eq "$username" }
$LevelGroups=$FromAbove | Get-ADGroupMember | where { $_.objectClass -eq "group" }
$LevelUsers
$LevelGroups | ForEach-Object { RecurseMembership $_ $username }
}
RecurseMembership $RootGroup $username