我对 AD 和 Powershell 还不熟悉,所以如果我使用了错误的术语,请原谅我。
我有一系列 50 多个 Active Directory 组,称为“ABC-something”。每个活跃用户都需要属于一个组。用户也是用于不同目的的其他组的成员,这不会影响此练习。
由于我们正在进行大规模迁移,我的用户数量是一个不断变动的目标。我处理的用户数量约为 1000 名,因此导出所有用户的所有会员资格并不理想。
我希望能够编写一个脚本,该脚本将返回每个属于多个组 ABC* 成员的用户的用户 ID(或 samAccountName),我可以根据需要运行该脚本。(我认为编写一个脚本来查找不在组中的活跃 AD 用户是完全不同的问题。)
从数据库的角度看,我看到的逻辑如下:
1) 遍历所有名为 ABC* 的组。对于每个组,捕获所有组成员。我最终应该在内存中得到一个表或对象,如下所示
组 1 人员
A 组 1 人员 B
组 2 人员 B
2)找到一种方法来对该列表进行分组,计数或迭代。
这就是我遇到困难的地方,因为到目前为止我见过的 Powershell 示例在导出或显示数据之前并没有对数据进行太多操作。
您能否建议一个示例脚本来帮助我入门,或者至少指出有关在 Powershell 中操作数据的在线资源?
答案1
使用Get-ADUser -Filter * -Properties memberOf
获取所有用户以及他们所属组的列表。
您可以将其导入 foreach 或 where-object 并应用任何所需的条件。如果您想知道用户是否在 foo 和 bar 中,您可以运行这样的命令。
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' )
}
或者说,您只是想知道至少 7 个组中有多少人?
Get-ADUser -Filter * -Properties memberOf | `
Where-Object {$_.memberof.count -ge 7}
答案2
除非你坚决要从群体角度来做这件事,否则我会浏览每个用户并查看他们的群体成员身份,如下所示:
$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
仅用于测试,请完全删除该部分以针对整个域运行它。这将遍历用户,并列出具有多个组的人员及其身份。
Get-ADGroup
并且Get-ADGroupMember
对用户来说应该和上面的命令类似。
您还可以使用类似以下内容的内容作为从等式的组侧来查看它的开始:
Get-ADGroup 'ABC-something' | Get-ADGroupMember
答案3
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 帐户名称以及他们所在的组数(如果大于一)。
答案4
就我而言,我需要许多 AD 组名的数组,然后查看是否有任何用户属于多个其中任何一个组。
- 如果任何用户同时属于多个组,那么就会出现问题,并导致与组策略首选项及其“成员”条件发生冲突。
在这里的答案的帮助下,我想出了这个变体,它帮助我自动化了一个常规计划流程,如果变量中定义的组列表中有多个组中的帐户,它将发送一封包含详细信息的电子邮件$g
。
SamAccountName
这基本上创建了一个包含和的列表Group
,然后Group-Object
对SamAccountName
执行操作以仅列出其计数大于 1 的列表。
电源外壳
$g = @("group1","group2","group a","group z");
$g | ForEach-Object {
$b = $_; Get-ADGroupMember -Identity $_ | Select-Object SamAccountName, @{n="ADGroup";e={$b};}
} | Group-Object -Property SamAccountName |
Where-Object {$_.Count -gt 1};
输出列表示例
笔记:这是分组列表的示例,group-object
然后显示SamAccountName
计数大于 1 的值。
SamAccountName ADGroup
-------------- -------
jsmith group1
bobama group1
dtrump group2
swalton group2
pjuiceit group a
aventura group a
apowers group z
drevil group z