我开始使用PowerShell,并试图使此行正常工作:
(Get-ADUser -Filter {userPrincipalName -eq $($ListUsers[100].UserPrincipalName)} -SearchBase "..." -Properties *).distinguishedName
我尝试了很多不同的方法,但是没有用。
$ListUsers[100].UserPrincipalName)
的调用可以100%确定,我在行外尝试过,所以这只是一个逻辑或语法问题。
有人可以告诉我如何使其工作吗?谢谢
答案 0 :(得分:3)
使用双引号。
-Filter
cmdlet的Get-AD*
参数采用字符串(!),而不是脚本块(尽管看起来像这样,因为也可以使用大括号代替引号)。
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过滤器字符串可以很长而不会引起服务器的抱怨,并且只进行一次到域控制器的往返即可节省时间。