【问题标题】:How to pass a variable to -Filter如何将变量传递给 -Filter
【发布时间】:2017-01-24 03:00:22
【问题描述】:

我在PS中遇到了一个很奇怪的情况。

在我拥有的脚本中,有一个 cmdlet (Get-Mailbox) 可以拉回一些邮箱并将它们存储在 $mailboxes 中。

然后我按如下方式循环查找匹配的 AD 帐户。

foreach ($user in $mailboxes) {
    Get-ADUser -Filter {UserPrincipalName -eq $user.UserPrincipalName}
}

当我运行它时,它会报错说它在$user 上找不到属性UserPrincipalName

我已经调试了脚本并对其进行了彻底的测试。如果我输入 $user.UserPrincipalName 会出错,它会输出一个 UPN 列表,并且它们的日期类型是字符串,因此该属性在那里并且有数据。

我得出的结论是,由于某种原因,-Filter 看不到 $user 变量 - 好像它被隔离在 {} 括号内,我听说函数可能就是这种情况。但是,如果我像这样修改代码,它会起作用。

foreach ($user in $mailboxes) {
    $name = $user.UserPrincipalName
    Get-ADUser -Filter {UserPrincipalName -eq $name}
}

虽然这解决了我的问题,但我想了解为什么第一个示例不起作用。谁能解释一下?

值得注意的是get-mailbox实际上首先连接到Exchange Online并返回一个数据类型:

Deserialized.Microsoft.Exchange.Data.Directory.Management.Mailbox

但是当Get-ADUser 命令出错时,它说对象是PSCustomobject 类型。我认为这可能是问题的一部分。

【问题讨论】:

  • 所以...我看不到如何编辑这篇文章,但我注意到顶部有一个错字。 $userlist 应该说 $mailboxes 否则当然会导致重大问题!

标签: powershell active-directory office365


【解决方案1】:
Get-ADUser -Filter "userprincipalname -eq '$($user.userprincipalname)'"

我不知道为什么,但这里有更多关于 Get-ADUser 可以使用和不使用的语法的讨论,以及您使用的脚本块语法如何与完整的用户对象一起使用,但不能与 PSCustomObject 一起使用,这里:

http://www.powershellish.com/blog/2015-11-17-ad-filter

【讨论】:

  • 我知道这一点,我只是没有把它写在我的帖子中,因为我不是在寻找替代品,而是试图解决我的失败。不过还是谢谢你的建议。
  • 看看答案中的链接。 Also related.
猜你喜欢
  • 2013-10-10
  • 2021-05-25
  • 2018-12-28
  • 2011-04-12
  • 2018-05-17
  • 2012-04-20
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多