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

Gra*_*ant 4 powershell active-directory

我已经开始设置组,如:

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

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

我知道如何使用 powershell 列出一个人所属的组,可以是直接分配的组,也可以是通过嵌套组继承的组。

但是我想弄清楚的是一个脚本,它将直接和间接地向我显示属于这些组之一的所有用户,例如。用户 A 是部门员工和部门主管的直接成员。

我的谷歌搜索未能找到或编写可以做到这一点的脚本。

编辑:

实际上,嵌套的层数和分支更多,部门也很多,所以很混乱。我想获得直接属于任何组的成员列表,以及间接属于同一组的成员,以便我可以删除多余的组直接成员资格。

jsc*_*ott 5

以下将遍历给定的父组(名称必须与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 }
Run Code Online (Sandbox Code Playgroud)