Powershell – 查找属于多个AD组的用户

我是AD和Powershell的新手,所以请原谅我,如果我使用了错误的术语。

我有一系列50多个Active Directory组,称为“ABC-something”。 每个活动用户都需要属于一个组。 用户也是用于不同目的的其他组的成员,不应该影响此练习。

由于我们处在一个大动作的中间,我的人口是一个移动的目标。 我正在处理大约1000个用户,所以通过所有用户的所有成员的出口是不可取的。

我希望能够编写一个脚本,将返回每个用户的userid(或samAccountName),这是作为多个组ABC *的成员,我可以按需运行。 (我假设写一个脚本来find活跃的AD用户不在一个组中是完全不同的问题。)

戴上我的数据库帽子,我看到如下的逻辑:

1)遍历所有组名为ABC *。 为每个,捕捉所有组成员。 记忆中的桌子或物体看起来就像

Group1 PersonA
组1 PersonB
Group2 PersonB

2)find一个方法来分组,或计数,或迭代通过这个列表。

这是我卡住的地方,因为我目前看到的Powershell示例在导出或显示数据之前不会操纵数据。

你能否提供一个示例脚本让我开始,或者至less指向在Powershell中操纵数据的在线资源?

使用Get-ADUser -Filter * -Properties memberOf获取所有用户以及他们所属的组的列表。

你可以把它变成一个foreach或者where-object并且应用任何必要的标准。 如果你想知道用户是否在用,并且你可以像这样运行一个命令。

 Get-ADUser -Filter * -Properties memberOf | ` Where-Object { $_.memberof.contains('CN=foo,OU=allsites,DC=example,DC=org') -and ` $_.memberof.contains('CN=bar,OU=allsites,DC=example,DC=org' ) } 

或者让你说只想知道有多less人至less有七组?

 Get-ADUser -Filter * -Properties memberOf | ` Where-Object {$_.memberof.count -ge 7} 

除非你从组织的angular度来看待这个问题,否则我会跑过每个用户,看看他们的组员身份,而不是:

 $Users = get-aduser -filter '*' -ResultSetSize 10 foreach ( $User in $Users ) { $uGroups = Get-ADPrincipalGroupMembership $User if ( $uGroups.Count -ne 1 ) { "{0} is a member of the following {1} groups:" -f $User.SamAccountName, $uGroups.Count foreach ( $group in $uGroups ) { "`t{0}" -f $group.Name } } } 

第一行的-ResultSetSize 10仅用于testing,完全删除该部分以针对整个域运行。 这将遍历用户,并列出超过1个组的人员,以及他们是什么。

Get-ADGroupGet-ADGroupMember应该与上面的用户命令类似。

你也可以使用类似下面的内容作为开始从等式的组边看它:

 Get-ADGroup 'ABC-something' | Get-ADGroupMember 

Powershell可以在这里为你做大部分繁重的工作。 我在这个例子中使用了Quest AD cmdlet,但是标准的cmdlet也可以工作。

 $FullList = @(ForEach $group in (Get-QADGroup -Identity ABC_)) { Get-QADGroupMember $group|Select @{name="Group";expression={$group.Name}}, @{name="Member";expression={$_.SAMAccountName}} } ) $FullList | Group-Object -Property Member |Where {$_.Count -gt 1} 

如果超过一个,会给出所有用户SAM帐户名称和它们所在组的数量的输出。