我正在尝试查询某个域中特定组中某个 OU 中的所有用户,而不是另一个特定组中的所有用户。
首先,我在 Active Directory 中查询所有三组用户:OU、要包含的组和要排除的组。要排除的组恰好是一个通讯组,因此我必须以不同的方式查询它。
$OU = Get-ADUser -Filter * -SearchBase "OU=Developers,OU=Everyone,DC=Organization,DC=com" -Properties MemberOf
$include = Get-ADGroupMember -Identity "this group"
$exclude = Get-ADObject -Filter 'Name -eq "that group"' -Properties member | Select-Object -ExpandProperty member | ForEach-Object { Get-ADUser -Identity $_ }
我测试了每个变量的命令,它们都可以独立工作。肯定是比较它们的逻辑不好,或者输出差异太大而无法比较。
我尝试将它们与
foreach
循环进行比较。
foreach ($user in $OU) {
if (($include -contains $user.DistinguishedName) -and (-not $exclude -contains $user.DistinguishedName)) {
Write-Host $user.SAMAccountName
}
}
..并通过管道将它们穿过
Where-Object
。
$filteredUsers = $OU | Where-Object {
($include -contains $_.DistinguishedName) -and
-not ($exclude -contains $_.DistinguishedName)
}
但是这些语句都没有返回输出。我做错了什么?是我的逻辑有问题,还是我比较了错误的值?
如果您使用 LDAP 来获取用户而不是过滤客户端,会更容易、更高效:
$groupToInclude = (Get-ADGroup groupToInclude).DistinguishedName
$groupToExclude = (Get-ADGroup groupToExclude).DistinguishedName
$getADUserSplat = @{
LDAPFilter = "(&(memberOf=$groupToInclude)(!memberOf=$groupToExclude))"
SearchBase = 'OU=Developers,OU=Everyone,DC=Organization,DC=com'
}
Get-ADUser @getADUserSplat