我已经开始设置组:
部门主pipe是部门工作人员的成员,部门主任是部门主pipe的成员。
我知道如何使用powershell列出一个人是哪个组的成员,可以直接分配,也可以通过嵌套组inheritance。
但是我想要弄清楚的是一个脚本,它将直接或间接地向我展示所有属于这些组的成员的用户,例如。 用户A是部门工作人员和部门主任的直接成员。
我的searchfunction使我无法find或编写一个可以做到这一点的脚本。
编辑:
实际上,嵌套层次多,分支多,部门多,容易混淆。 我想直接得到任何一个小组的成员名单,也可以间接获得同一小组的成员名单,这样我就可以删除多余的小组直接成员资格。
以下将遍历给定的父组(名称必须与Get-ADGroupMember语法兼容)并填充两个散列。 一个散列将具有用户sAMAccountName作为键和直接组成员身份数组作为值。 第二个散列将包含所有处理组的键。
它会正确检测并跳过循环组嵌套(例如,父母是孩子的孩子)。 您可以在控制台中注释Write-Host线路以减less线路噪声。
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 }
编辑:根据您更新的描述这样的事情应该工作。 请注意,我没有照顾组成员的循环,所以你可能会发现它永远运行。
$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