【问题标题】:PowerShell script to return members of multiple security groupsPowerShell 脚本返回多个安全组的成员
【发布时间】:2013-06-16 06:11:25
【问题描述】:

我需要使用 PowerShell 返回多个安全组的所有成员。方便的是,所有组都以相同的字母开头。

我可以使用以下代码返回所有相关安全组的列表:

Get-ADGroup -filter 'Name -like"ABC*"' | Select-Object Name

而且我知道我可以使用以下代码返回特定安全组的成员列表:

Get-ADGroupMember "Security Group Name" -recursive | Select-Object Name

但是,我似乎无法将它们放在一起,尽管我认为我所追求的应该看起来像这样(请随时纠正我,这就是我在这里的原因!):

$Groups = Get-ADGroup -filter 'Name -like"ABC*"' | Select-Object Name
ForEach ($Group in $Groups) {Get-ADGroupMember -$Group -recursive | Select-Object Name

任何关于如何正确构建的想法都将不胜感激!

谢谢,

克里斯

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    这样更干净,可以放入 csv。

    Import-Module ActiveDirectory
    
    $Groups = (Get-AdGroup -filter * | Where {$_.name -like "**"} | select name -expandproperty name)
    
    
    $Table = @()
    
    $Record = [ordered]@{
    "Group Name" = ""
    "Name" = ""
    "Username" = ""
    }
    
    
    
    Foreach ($Group in $Groups)
    {
    
    $Arrayofmembers = Get-ADGroupMember -identity $Group | select name,samaccountname
    
    foreach ($Member in $Arrayofmembers)
    {
    $Record."Group Name" = $Group
    $Record."Name" = $Member.name
    $Record."UserName" = $Member.samaccountname
    $objRecord = New-Object PSObject -property $Record
    $Table += $objrecord
    
    }
    
    }
    
    $Table | export-csv "C:\temp\SecurityGroups.csv" -NoTypeInformation
    

    【讨论】:

    • 太棒了!这还允许您使用新的 PS 对象将组名放入 CSV。不错。
    • 在我为 PS2.0 删除 [ordered](使用 $PSVersionTable.PSVersion 检查您的版本)后,这对我有用,将 -Encoding UTF8 添加到 Export-CSV 以处理名称中的非 ascii 字符,并将 -recursive 添加到 Get-ADGroupMember 以列出嵌套组的成员(或者,您可能希望在输出中添加 objectClass 属性以区分成员组和成员用户)。
    【解决方案2】:
    Get-ADGroupMember "Group1" -recursive | Select-Object Name | Export-Csv c:\path\Groups.csv
    

    我让这个为我工作...我假设您可以输入“Group1、Group2 等”。或尝试通配符。 我事先将 AD 预加载到 PowerShell 中:

    Get-Module -ListAvailable | Import-Module
    

    【讨论】:

    • 以上链接标题为“如何在 Windows 7 的 PowerShell 中添加 Active Directory 模块”
    • 你可以not 'put "Group1, Group2, etc.': "Cannot find an object with identity: 'Group1, Group2'"
    【解决方案3】:

    如果您不关心用户所在的组,而只想要一个大的用户列表 - 这可以完成工作:

    $Groups = Get-ADGroup -Filter {Name -like "AB*"}
    
    $rtn = @(); ForEach ($Group in $Groups) {
        $rtn += (Get-ADGroupMember -Identity "$($Group.Name)" -Recursive)
    }
    

    那么结果:

    $rtn | ft -autosize
    

    【讨论】:

    • 谢谢,我做了一个小改动,只是为了只返回名称,这使脚本变成了以下内容: $Groups = Get-ADGroup -Filter {Name -like "TIG*"} $rtn = @() ForEach ($Groups 中的$Group) { $rtn += (Get-ADGroupMember -Identity "$($Group.Name)" -Recursive | select-object name) } $rtn | ft' 这确实返回了重复项(因为有些人在多个组中),但是对我来说这很好,因为我只是将结果复制到 Excel 中并删除了重复项。非常感谢,克里斯
    • 很高兴我能提供帮助.. 作为旁注,在返回结果时添加:$rtn | select Name -unique | ft -autosize 会消除重复项。
    • 这更容易一些,结果相同:get-ADGroup -filter {Name -like "AB*"} |获取-ADGroupMember | ft -AutoSize 祝你好运! :)
    【解决方案4】:

    这将为您提供单个组的列表,以及每个组的成员。

    param
    (   
        [Parameter(Mandatory=$true,position=0)]
        [String]$GroupName
    )
    
    import-module activedirectory
    
    # optional, add a wild card..
    # $groups = $groups + "*"
    
    $Groups = Get-ADGroup -filter {Name -like $GroupName} | Select-Object Name
    
    ForEach ($Group in $Groups)
       {write-host " "
        write-host "$($group.name)"
        write-host "----------------------------"
    
        Get-ADGroupMember -identity $($groupname) -recursive | Select-Object samaccountname
    
     }
    write-host "Export Complete"
    

    如果您需要友好名称或其他详细信息,请将它们添加到选择对象查询的末尾。

    【讨论】:

    • 您好 user2883951,它就像一个魅力,但是它在列出每个用户名之前不显示组名?
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多