获取 ADUser 滤波器比较



我从PowerShell开始,并试图使这一行工作:

(Get-ADUser -Filter {userPrincipalName -eq $($ListUsers[100].UserPrincipalName)} -SearchBase "..." -Properties *).distinguishedName

我尝试了很多不同的东西,但没有任何效果。

$ListUsers[100].UserPrincipalName)的调用 100% 确定,我在行外尝试过,所以这只是一个逻辑或语法问题。

有人可以告诉我如何让它工作吗?谢谢

使用双引号。

Get-AD*cmdlet 的-Filter参数采用字符串 (!(,而不是脚本块(即使它看起来像它,因为也可以使用大括号代替引号(。

Get-ADUser -Filter "userPrincipalName -eq '$($ListUsers[100].UserPrincipalName)'"

这样你就可以得到适当的变量替换。请注意,您必须最终得到有效的筛选器字符串,因此当这些值是字符串时,必须在这些值两边加上单引号。


如果要从 AD 获取许多对象,则一次性获取所有对象比在循环中逐个获取会有所帮助。考虑一下:

$ListUsers = @(<# ...list of items... #>)
# build LDAP filter string
$upn_filter = $ListUsers.UserPrincipalName -join ')(userPrincipalName='
$upn_filter = "(|(userPrincipalName=$upn_filter))"
$users = Get-ADUser -LDAPFilter $upn_filter
$users.distinguishedName

这将以以下形式构建 LDAP 过滤器:

(|(userPrincipalName=A)(userPrincipalName=B)(userPrincipalName=C)(userPrincipalName=D))

这将能够一步从AD获取4个匹配的对象。当然,您也可以构建"PowerShell 样式"的筛选器字符串,但我发现 LDAP 语法更容易处理,而且更短。

LDAP 筛选器字符串可以很长而不会服务器抱怨,并且只对域控制器进行一次往返可以节省时间。

最新更新