PowerShell和Active Directory用户pipe理

问题:从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看起来像这样(依我而言):

  1. 用正确的前缀枚举所有的组。
  2. recursion地跟随他们的GroupMembers枚举它们中的任何嵌套组。
    1. 一旦你得到一个没有组作为成员的组,停止recursion。
  3. 以每个用户的用户名单
    1. 列举他们的组成员
    2. 如果有任何正确的前缀,请将其从中删除。
    3. 如果剩下的组中有任何一个在上一个主要步骤中列举的组列表中,请将它们从其中删除。

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

使用前缀枚举所有组(未经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)。 那么你可以这样做。 首先几点:

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

 $ 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项在这篇文章 ,看看是否有帮助。