AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 509990
Accepted
Grant
Grant
Asked: 2013-05-23 09:49:56 +0800 CST2013-05-23 09:49:56 +0800 CST 2013-05-23 09:49:56 +0800 CST

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

  • 772

我已经开始设置群组,例如:

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

其中 Department-supervisors 是 Department-staff 的成员,Department-director 是 Department-supervisors 的成员。

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

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

我的谷歌搜索使我无法找到或编写可以执行此操作的脚本。

编辑:

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

active-directory
  • 2 2 个回答
  • 3290 Views

2 个回答

  • Voted
  1. Best Answer
    jscott
    2013-05-29T04:33:12+08:002013-05-29T04:33:12+08:00

    以下将遍历给定的父组(名称必须与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 }
    
    • 5
  2. Tim Brigham
    2013-05-23T10:01:26+08:002013-05-23T10:01:26+08:00

    编辑:根据您更新的描述,这样的事情应该有效。请注意,我没有处理组成员身份中的循环,因此您可能会发现它一直在运行。

    $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 
    
    • 2

相关问题

  • 如果以域用户身份远程登录,PC 速度极慢

  • 如何在 Windows 2003 的 ou 级别应用策略

  • 允许用户更改其 Active Directory 密码的 Web 界面

  • MOSS 2007 无法使用 ActiveDirectoryMembershipProvider 配置表单身份验证

  • 通过 VPN 更改 Active Directory 密码

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve