Powershell 两次显示属于某个组的成员用户 - 一次直接,一次间接

Powershell 两次显示属于某个组的成员用户 - 一次直接,一次间接

我已经开始建立如下群组:

  • 部门人员
    • 部门主管
      • 系主任

其中,部门主管是部门职员的成员,部门主任是部门主管的成员。

我知道如何使用 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 

相关内容