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 文档,但没有取得太大进展。提前致谢!
您正在寻找的基本算法看起来像这样(根据我的说法,无论如何):
现在是实际的类似代码的东西。
用前缀枚举所有组(未经测试,会有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)
然后根据需要删除相关组。
假设您想要做的是从具有特定前缀的所有组中删除每个用户,而不是基于任何其他标准(例如,从组 xyz 中删除用户 abc,从组 abc 中删除用户 xyz)。那么你可以这样做。不过首先要强调几点:
$user.Identity为$user.SAMAccountName)$prefix = "CN=abc-*"Run Code Online (Sandbox Code Playgroud)$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 } } }
如果您需要递归搜索,则需要尝试其他方法。你可以看看这篇文章中的第11 项,看看它是否有帮助。