我是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-ADGroup和Get-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帐户名称和它们所在组的数量的输出。