我从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 筛选器字符串可以很长而不会服务器抱怨,并且只对域控制器进行一次往返可以节省时间。