列出不属于多个组之一的AD用户

时间:2013-09-13 04:43:08

标签: powershell active-directory user-management

首先,我不是剧本作家,所以如果这听起来像是一个真正的新手问题我会道歉。

我正在尝试编写一个Powershell查询,列出某个OU子树中不属于至少四个组之一的所有用户帐户。

据我所知,你不能直接在AD用户对象上查询,所以你需要遍历各组以获得成员资格,但我不清楚如何在多个组中进行此操作。< / p>

我已经整理了一个脚本,可以找到所有用户,将它们添加到一个临时组,然后删除它们,如果它们属于其他四个组之一,但这看起来像一个可怕的方式来接近它,所以我是希望有人有更好的解决方案。

这是我现在拥有的(不要笑): - (

Import-Module ActiveDirectory
$groupname = "TempGroup"
$excludegroup1 = "Group1"
$excludegroup2 = "Group2"
$excludegroup2 = "Group4"
$excludegroup2 = "Group4"
$users = Get-ADUser -Filter * -SearchBase "ou=xxx,dc=xxx,dc=xxx" -SearchScope Subtree
foreach($user in $users)
{
  Add-ADGroupMember -Identity $groupname -Member $user.samaccountname -ErrorAction SilentlyContinue
}
$members = Get-ADGroupMember -Identity $groupname
$excludemembers = Get-ADGroupMember -Identity $excludegroup1
foreach($member in $excludemembers)
{
 Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}
$members = Get-ADGroupMember -Identity $groupname
$excludemembers = Get-ADGroupMember -Identity $excludegroup2
foreach($member in $excludemembers)
{
 Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}
$members = Get-ADGroupMember -Identity $groupname
$excludemembers = Get-ADGroupMember -Identity $excludegroup3
foreach($member in $excludemembers)
{
 Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}
$members = Get-ADGroupMember -Identity $groupname
$excludemembers = Get-ADGroupMember -Identity $excludegroup4
foreach($member in $excludemembers)
{
 Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}

感谢所有帮助。

2 个答案:

答案 0 :(得分:2)

Active Directory中的所有用户,计算机,组和联系人(可能还有其他对象)都有一个名为 memberof 的属性。此属性包含此实体所属的整个林中所有组的可分辨名称,如属性的名称所示。

鉴于此信息,您现在可以构建一个ldap搜索查询,以查找不属于这些组中至少一个的所有实体:

(!(|(memberof=CN=Group1,dc=domain,dc=com)(memberof=CN=Group3,dc=domain,dc=com)(memberof=CN=Group3,dc=domain,dc=com)))

必要时可以包括其他条件。

如果您需要首先获取这些组的可分辨名称,您可以在过滤器中对它们进行硬编码,或者对组进行正常的Powershell搜索,然后读取它们的专有名称。

您可以通过命令-LDAPFilter parameter使用ldap查询。

答案 1 :(得分:0)

如果有人感兴趣,这就是我现在的代码。它使用一个组来刷新每次运行,因为那时我只需双击一个用户进入他们的对象并将它们添加到他们缺少的组中。

Import-Module ActiveDirectory
$groupname = "NotInGroups"
$members = Get-ADGroupMember -Identity $groupname
foreach($member in $members)
{
 Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}
$users = Get-ADUser -Filter {((memberof -notlike "CN=Group1,DC=domain,DC=local") -AND (memberof -notlike "CN=Group2,DC=domain,DC=local") -AND (memberof -notlike "CN=Group3,DC=domain,DC=local") -AND (memberof -notlike "CN=Group4,DC=domain,DC=local"))} -SearchBase "ou=users,dc=domin,dc=local" -SearchScope Subtree
foreach($user in $users)
{
  Add-ADGroupMember -Identity $groupname -Member $user.samaccountname -ErrorAction SilentlyContinue
}