【问题标题】:How to iterate through user's group membership and return user if they are a member of a list of groups如果用户是组列表的成员,如何遍历用户的组成员资格并返回用户
【发布时间】:2021-01-08 00:33:30
【问题描述】:

我在 csv 中有大量 samAccountNames,我需要编写一个脚本来检查每个用户并查看他们是否是 3 个 AD 组中的任何一个的成员。我尝试了一个在组中搜索然后找到用户的脚本,但我遇到了组包含太多成员的问题,这会引发错误。

我尝试遍历每个用户并提取组成员身份,但我认为我不知道如何正确搜索数组中的值,或者至少我认为这是我的问题

这就是我想要的:

#Groups to look for
$groups = 'Group1', 'Group2', 'Group3'

#Import users to check from a csv file
Import-Csv "$PSScriptroot\Users.csv" | ForEach-Object {

    #define users variable
    $users = $_."samAccountName"

    foreach ($user in $users) {

        #Get all groups that the $user is a member of
        $membership = Get-ADPrincipalGroupMembership $user | select name

        foreach ($group in $groups) {

            #Check if $group is in $membership
        }  
    }
}
#export a new csv of all $users who were found to be in an $groups

寻求有关如何完成此任务的任何帮助。谢谢!

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    考虑到您打算重新导出为 CSV,您需要考虑添加表示用户在给定组中的成员资格的布尔列(属性)。

    我没有对此进行测试,但这是一个想法:

    # Groups to look for
    $groups = 'Group1', 'Group2', 'Group3'
    
    # Import users to check from a csv file
    Import-Csv "$PSScriptroot\Users.csv" | 
    ForEach-Object {
    
        # Get all groups that the $user is a member of
        $membership = (Get-ADPrincipalGroupMembership $_.samAccountName).Name
    
        $_ | 
        Select-Object *,
            @{Name = 'Group1'; Expression = { 'Group1' -in $membership }},
            @{Name = 'Group2'; Expression = { 'Group2' -in $membership }},
            @{Name = 'Group3'; Expression = { 'Group3' -in $membership }}        
        
    } |
    Export-Csv -Path "$PSScriptroot\Users_New.csv" -NoTypeInformation
    

    在这种情况下,我们正在为Import-Csv 生成的对象添加属性。对于从Get-ADUserPrincipalGroupMembership 收到的成员资格,属性的值将是 True/False。然后,立即创建一个新的 CSV 文件。

    您还可以通过预加载组的成员资格并根据这些存储的列表检查用户来实现另一个方向。再次未经测试的 bu,可能看起来像:

    $Members =
    @{
        Group1 = (Get-ADGroupMember 'Group1').samAccountName
        Group2 = (Get-ADGroupMember 'Group2').samAccountName
        Group3 = (Get-ADGroupMember 'Group3').samAccountName
    }
    
    Import-Csv "$PSScriptroot\Users.csv" | 
    Select-Object *,
        @{Name = 'Group1'; Expression = { $_.samAccountName -in $Members['Group1'] }},
        @{Name = 'Group2'; Expression = { $_.samAccountName -in $Members['Group2'] }},
        @{Name = 'Group3'; Expression = { $_.samAccountName -in $Members['Group3'] }} |
    Export-Csv -Path "$PSScriptroot\Users_New.csv" -NoTypeInformation
    

    这具有额外的优势,即能够反复询问组成员身份。只需将-Recursive 开关参数添加到Get-ADGroupMember 命令即可。

    【讨论】:

    • 我尝试了第一个示例,每一行都有组的确切值。我抽查了一些帐户,显示的数据不正确。第二个示例不起作用,因为在超过 5000 的组上使用 Get-ADGroupMember 似乎破坏了我的脚本。
    • 修复它,添加 $user = $_."samAccountName" 以在 ForEach-Object 循环中定义 $user
    • 很高兴听到它正在工作。我纠正了第一个例子。至于 5000 名成员的限制,我不确定,但如果我有时间我会到处玩,看看我是否能弄清楚发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多