【问题标题】:Powershell Bulk Remove-ADGroupMemberPowershell 批量删除-ADGroupMember
【发布时间】:2019-08-09 18:46:37
【问题描述】:

我希望从 SAMAccountName、ADGroup 的导入 CSV 文件中批量删除多个组的成员。我可以遍历数组中的每条记录(其中将有 1600 个条目),但如果我可以整理特定组中的所有用户并使用多个用户发出 Remove-ADGroupMember 会更好。

我不确定如何处理数组中的数据,因此它显示为 ADGroup、MultipleSAMAccountNames - 我可能遗漏了一些明显的东西。

CSV 示例:

SAMAccountName, ADGroup
User1, GroupA
User2, GroupA
User3, GroupB
User4, GroupA

示例代码:

Import-Module ActiveDirectory
$Users = Import-CSV "Users.csv"
foreach ($User in $Users)
 {
 Remove-ADGroupMember -identity $User.ADGroup -Members $User.SAMAccountName
 }

期望:

foreach ($Group in $Users)
     {
    Remove-ADGroupMember -identity $Group.ADGroup -Members $Group.MultipleSAMAccountNames
     }

提前致谢

【问题讨论】:

    标签: arrays powershell


    【解决方案1】:

    试试这个:

    $Users = Import-CSV "Users.csv"
    $Groups = $Users.ADGroup | Sort-Object -Unique
    
    foreach ($Group in $Groups) {
        Remove-ADGroupMember -identity $Group -Members ($Users | Where-Object { $_.ADGroup -eq $Group }).SamAccountName
    }
    
    • 获取 CSV 中组的唯一列表。
    • 循环遍历每个唯一组并使用Where-Object 过滤$Users 以查找与该组匹配的任何用户,然后将其结果发送到-Members 参数。

    请注意,这是未经测试的代码,因此请谨慎使用。

    【讨论】:

    • 谢谢 Mark,令人讨厌的是,-WhatIf 参数没有提供足够的详细信息来确定它将执行什么操作,而不是对组执行 SET 命令 - 我可以运行 Where-object 命令在确实返回与该组关联的用户的调试器中,每行一个 - 我不确定 Remove-ADGroupMember 命令将如何处理它,因为它需要一个逗号分隔的列表或用户。我可以将您的代码修改为 $UsersCSV = ($Users | Where-Object { $_.ADGroup -eq $Group }).SamAccountName - join "," 在循环中并将该变量传递给 -Members 参数。
    • 我认为您可能误解了文档。它不希望它是一个逗号分隔的列表,而是一个字符串数组,这是我的where-object 为您创建的(它只是当一个数组输出到控制台时,它显示为每行一个)。
    • 我建议您创建一个测试组进行测试,以确保它达到您的预期,尤其是-whatif 没有为您提供足够明确的信息。
    • 谢谢马克,有道理。
    【解决方案2】:

    Mark Wragg 打败了我,但这是我的(也是未经测试的)解决方案,不需要 Where-Object 子句:

    Import-Module ActiveDirectory
    
    # read the CSV file and group the objects by the 'ADGroup' property
    $UsersAndGroups = Import-CSV "Users.csv" | Group-Object -Property ADGroup
    
    # loop through the groups
    foreach ($group in $UsersAndGroups) {
        # get an array of users belonging to this group
        $accounts = $group.Group | Select-Object -ExpandProperty SAMAccountName -Unique
        # remove them all from the group
        Remove-ADGroupMember -Identity $group.Name -Members $accounts
    }
    

    出于测试目的,在Remove-ADGroupMember 命令的末尾添加-WhatIf 开关。

    【讨论】:

    • 谢谢 Theo,抱歉,我无法让您的代码正常工作 - $UsersAndGroups 变量包含一个数组行中的所有记录 - 计数、名称、组 - 名称为空白且组数据类似于 {@{@{SAMAccountName=joe.bloggs;Group=grp.example} - 同一个用户也被重复了好几次。
    • @Johnnie 啊,对不起,我的错误.. 复制/粘贴时,我不知何故在其中留下了 ConvertFrom-Csv。我现在已经更正了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多