【问题标题】:Get-ADUser Filter comparison [duplicate]Get-ADUser 过滤器比较 [重复]
【发布时间】:2019-09-06 13:35:17
【问题描述】:

我开始使用 PowerShell 并尝试使这条线正常工作:

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

我尝试了很多不同的方法,但都没有奏效。

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

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

【问题讨论】:

  • 也看看我对我的回答所做的补充。

标签: powershell active-directory


【解决方案1】:

使用双引号。

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 过滤器字符串可以变得很长而服务器不会抱怨,并且只往返域控制器可以节省时间。

【讨论】:

  • 一个 LDAP 查询(不仅仅是查询字符串)的总大小可以是 up to 10MB,这是相当大的。不过,我有一些示例代码here,它显示了如何将请求分解为 50 个块(或您想要的任何数量)。代码是 C#,但可以转换为 PowerShell(PowerShell 数组实现 .NET 的IEnumerable)。
  • @GabrielLuci 很好,这是我自己的问题,你要链接到。 :)
  • 哈!我什至没有注意到。当事情在 10 年后仍然相关时,这真是太棒了:)
  • 不错;重新“在值周围加上单引号是必要的”:值得一提的是嵌入的 double 引号也是一种选择 - 虽然它们需要被转义,但它们对于可能包含单引号(撇号)的扩展值很有帮助)。
猜你喜欢
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
相关资源
最近更新 更多