查找不属于多个组的用户
Find users who don't belong to multiple groups
我的公司使用 Microsoft Intune。我们在控制条件访问的本地 AD 中有 4 个组。我们只称它们为 AllowGroup1、AllowGroup2、BlockGroup1 和 BlockGroup2。我想知道找到的是不在所有组中的所有用户。我想要查找的结果是不在上述组中的任何用户对象。这样我就可以提供证据证明我们的整个系统是合规的。请参阅下面我从 post List AD Users who do not belong to one of several groups
中借用的 Powershell 代码
我正在 运行 我的家庭域控制器上进行这些测试。我遇到的问题是脚本没有在整个域中查找用户。具体来说,我的个人 DC 中有一个 OU,名为 Home(我创建了 OU),子 OU 中有 2 个用户对象,名为 Users 这个脚本不是从中提取的。我 运行 这个脚本的用户是 Enterprise Admins 组中的一个用户,所以我知道它有足够的权限。它应该通过 PowerShell 在 AD 中搜索不在多个组中的用户,并将这些用户放在一个名为 NotInGroup
的组中
进一步说明,一些用户将在 AllowGroup1 和 BlockGroup2 中。一些用户将在 BlockGroup1 和 BlockGroup2 中。我想找到 不在上面列出的任何组 中的所有用户。
Import-Module ActiveDirectory
$groupname = "NotInGroup"
$members = Get-ADGroupMember -Identity $groupname
foreach($member in $members)
{
Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}
$users = Get-ADUser -Filter
{
((memberof -notlike "CN=AllowGroup1,OU=Intune,OU=Groups,DC=domain,DC=local")
-AND (memberof -notlike "CN=AllowGroup2,OU=Intune,OU=Groups,DC=domain,DC=local")
-AND (memberof -notlike "CN=BlockGroup1,OU=Intune,OU=Groups,DC=domain,DC=local")
-AND (memberof -notlike "CN=BlockGroup2,OU=Intune,OU=Groups,DC=domain,DC=local"))
}
-SearchBase "dc=domain,dc=local" -SearchScope Subtree
foreach($user in $users)
{
Add-ADGroupMember -Identity $groupname -Members $user.samaccountname -ErrorAction SilentlyContinue
}
我不认为像那样的复杂过滤器会起作用,我会选择使用正则表达式。
也许像
# get users not in groups 'AllowGroup1', 'AllowGroup2', 'BlockGroup1', 'BlockGroup2'
$regex = 'CN=(AllowGroup[12]|BlockGroup[12])'
$users = Get-ADUser -Filter * -Properties MemberOf | Where-Object { ($_.MemberOf -join ';') -notmatch $regex }
或者您可以尝试使用 LDAPFilter
参数:
$filter = '(!(|(memberof=CN=AllowGroup1,OU=Intune,OU=Groups,DC=domain,DC=local)
(memberof=CN=AllowGroup2,OU=Intune,OU=Groups,DC=domain,DC=local)
(memberof=CN=BlockGroup1,OU=Intune,OU=Groups,DC=domain,DC=local)
(memberof=CN=BlockGroup2,OU=Intune,OU=Groups,DC=domain,DC=local)))'
$users = Get-ADUser -LDAPFilter $filter
两个参数 Filter
和 LDAPFilter
都需要 字符串 ,而不是脚本块
我的公司使用 Microsoft Intune。我们在控制条件访问的本地 AD 中有 4 个组。我们只称它们为 AllowGroup1、AllowGroup2、BlockGroup1 和 BlockGroup2。我想知道找到的是不在所有组中的所有用户。我想要查找的结果是不在上述组中的任何用户对象。这样我就可以提供证据证明我们的整个系统是合规的。请参阅下面我从 post List AD Users who do not belong to one of several groups
中借用的 Powershell 代码我正在 运行 我的家庭域控制器上进行这些测试。我遇到的问题是脚本没有在整个域中查找用户。具体来说,我的个人 DC 中有一个 OU,名为 Home(我创建了 OU),子 OU 中有 2 个用户对象,名为 Users 这个脚本不是从中提取的。我 运行 这个脚本的用户是 Enterprise Admins 组中的一个用户,所以我知道它有足够的权限。它应该通过 PowerShell 在 AD 中搜索不在多个组中的用户,并将这些用户放在一个名为 NotInGroup
的组中进一步说明,一些用户将在 AllowGroup1 和 BlockGroup2 中。一些用户将在 BlockGroup1 和 BlockGroup2 中。我想找到 不在上面列出的任何组 中的所有用户。
Import-Module ActiveDirectory
$groupname = "NotInGroup"
$members = Get-ADGroupMember -Identity $groupname
foreach($member in $members)
{
Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
}
$users = Get-ADUser -Filter
{
((memberof -notlike "CN=AllowGroup1,OU=Intune,OU=Groups,DC=domain,DC=local")
-AND (memberof -notlike "CN=AllowGroup2,OU=Intune,OU=Groups,DC=domain,DC=local")
-AND (memberof -notlike "CN=BlockGroup1,OU=Intune,OU=Groups,DC=domain,DC=local")
-AND (memberof -notlike "CN=BlockGroup2,OU=Intune,OU=Groups,DC=domain,DC=local"))
}
-SearchBase "dc=domain,dc=local" -SearchScope Subtree
foreach($user in $users)
{
Add-ADGroupMember -Identity $groupname -Members $user.samaccountname -ErrorAction SilentlyContinue
}
我不认为像那样的复杂过滤器会起作用,我会选择使用正则表达式。
也许像
# get users not in groups 'AllowGroup1', 'AllowGroup2', 'BlockGroup1', 'BlockGroup2'
$regex = 'CN=(AllowGroup[12]|BlockGroup[12])'
$users = Get-ADUser -Filter * -Properties MemberOf | Where-Object { ($_.MemberOf -join ';') -notmatch $regex }
或者您可以尝试使用 LDAPFilter
参数:
$filter = '(!(|(memberof=CN=AllowGroup1,OU=Intune,OU=Groups,DC=domain,DC=local)
(memberof=CN=AllowGroup2,OU=Intune,OU=Groups,DC=domain,DC=local)
(memberof=CN=BlockGroup1,OU=Intune,OU=Groups,DC=domain,DC=local)
(memberof=CN=BlockGroup2,OU=Intune,OU=Groups,DC=domain,DC=local)))'
$users = Get-ADUser -LDAPFilter $filter
两个参数 Filter
和 LDAPFilter
都需要 字符串 ,而不是脚本块