问题:从CSV文件中获取用户名列表,并从它们所属的所有用户组中recursion删除它们。 我想根据组名称的前缀限制他们被删除的组。
示例:如果user_bob(CSV中的许多用户名之一)是下列组的成员(recursion确定):abc-users,abc-printers,abc-users-limited,xzy-users,xyz-secure,则我想让PowerShell脚本将其从所有以“abc-”为前缀的组中删除,然后转到CSV中的下一个用户名并执行相同的过程。
注:我一直在网上search这样的事情的例子,似乎无法find任何线索。 代码片段或样本,我可以开始进行testing或融入到一个解决scheme,将不胜感激。 我一直在浏览命令行的TechNet文档 ,并没有取得太多的进展。 提前致谢!
你正在寻找的基本algorithm看起来像这样(依我而言):
现在来看看实际的类似代码的东西。
使用前缀枚举所有组(未经testing,将会有错误):
$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) } } }
然后,当谈到CSV列表时,获取用户的成员资格,并检查该组是否存在于上面的$ TargetList中。 如果是这样,删除它。
从成千上万个组中删除一个用户时,这是一个很大的工作,但是如果你正在做很多这样的工作,那么使用预先build立的列表将节省您的时间。
如果你只需要为less数用户(比如说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) }
然后根据需要删除相关的组。
假设你想要做的是从具有特定前缀的所有组中删除每个用户,而不是基于任何其他标准(例如,从组xyz中删除用户abc,从组abc中删除用户abc)。 那么你可以这样做。 首先几点:
$user.Identity更改为$user.SAMAccountName ) $ prefix =“CN = abc- *”
$ userlist = Import-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 } } }
如果您需要recursionsearch,则需要尝试其他方法。 你可以看看第11项在这篇文章 ,看看是否有帮助。