PowerShell 和 Active Directory 用户管理

Joh*_*ohn 1 scripting powershell active-directory user-management

问题: 从 CSV 文件中获取用户名列表,并从他们所属的所有用户组中递归删除它们。我想根据组名的前缀来限制他们从哪些组中删除。

示例: 如果 user_bob(CSV 中的众多用户名之一)是以下组的成员(递归确定):abc-users、abc-printers、abc-users-limited、xzy-users、xyz-secure,则我想让 PowerShell 脚本将他从所有前缀为“abc-”的组中删除,然后转到 CSV 中的下一个用户名并执行相同的过程。

注意: 我一直在网上搜索类似这样的例子,但似乎找不到任何线索。非常感谢我可以开始测试过程或将它们组合到解决方案中的代码片段或示例。我一直在查看有关 commandlet的TechNet 文档,但没有取得太大进展。提前致谢!

sys*_*138 5

您正在寻找的基本算法看起来像这样(根据我的说法,无论如何):

  1. 枚举具有正确前缀的所有组。
  2. 递归地跟踪它们的 GroupMembers 以枚举其中的任何嵌套组。
    1. 一旦你得到一个没有组作为成员的组,停止递归。
  3. 为每个用户获取用户列表
    1. 枚举他们的组成员身份
    2. 如果有正确的前缀,请将它们从中删除。
    3. 如果任何剩余的组在上一个主要步骤中列举的组列表中,也将它们从该组中删除。

现在是实际的类似代码的东西。

用前缀枚举所有组(未经测试,会有bug):

$RecurseList=dsquery group -name "abc-*"
$TargetList=$RecurseList
foreach $Grp in $RecurseList {
    # Now get the members of that group, do not expand
    $GrpMembers=dsget group "$Grp" -members
    foreach ($Member in $GrpMembers) {
        $isGroup=dsget group $Member
        if ($isGroup.dn -eq $Member) {
            $TargetList.add("$Member")
            RecurseIntoGroup($isGroup.dn)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后当谈到 CSV 列表时,获取用户的成员资格,并检查该组是否存在于上面的 $TargetList 中。如果是这样,请将其删除。

从可能的数千个组中仅删除一个用户时,这是一项艰巨的工作,但如果您正在执行大量此类工作,那么拥有预先构建的列表将节省您的时间。

如果您只需要为少数用户(例如 10 个左右)执行此操作,则可以返回树。

$UserGroups = dsquery user -name $Username -memberof
foreach ($uGroup in $UserGroups) {
    if (isConcerning($uGroup)) {
        $ConcerningGroups.add("$uGroup")
    }
}

function isConcerning {
param ($uGroup)

$parentGroups=dsget group $uGroup -memberOf
$found=$False
foreach ($pg in $parentGroup) {
    if ($parentGroup.startswith("abc-")) {
    return($true)
    $found=$true
    } else {
        $concerning=isConcerning($pg)
        if ($concerning) {
            return($true)
            $found=$true
        } 
    }
}
if (-not $found) {
    return($False)
}
Run Code Online (Sandbox Code Playgroud)

然后根据需要删除相关组。


Mat*_*att 5

假设您想要做的是从具有特定前缀的所有组中删除每个用户,而不是基于任何其他标准(例如,从组 xyz 中删除用户 abc,从组 abc 中删除用户 xyz)。那么你可以这样做。不过首先要强调几点:

  1. CSV 文件中的用户名是什么格式?这将决定您如何搜索用户,您需要相应地更新参数(例如更改$user.Identity$user.SAMAccountName
  2. 这需要 AD Powershell cmdlet,因此您需要先导入 AD 模块(或在 DC 或安装了管理工具的计算机上的 AD Powershell 控制台中运行它)
  3. 以下仅适用于直接组成员身份,不适用于递归组成员身份。

$prefix = "CN=abc-*"

$userlist = 导入-CSV userlist.csv

foreach ($userlist 中的 $user) { $currentuser = Get-ADUser $user.Identity -properties memberof $grouplist = $currentuser.memberof

foreach ($group in $grouplist) { if ($group -like $prefix) { Get-ADGroup $group | Remove-ADGroupMember -members $currentuser -Confirm:$false } } }
Run Code Online (Sandbox Code Playgroud)

如果您需要递归搜索,则需要尝试其他方法。你可以看看这篇文章中的第11 项,看看它是否有帮助。