如何将变量传递给-Filter

时间:2016-09-16 00:04:25

标签: powershell active-directory office365

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

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

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

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

当我运行此错误时,表示无法在UserPrincipalName上找到属性$user

我已经调试了脚本并对其进行了彻底的测试。如果我输入$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。我认为这可能是问题的一部分。

1 个答案:

答案 0 :(得分:2)

Get-ADUser -Filter "userprincipalname -eq '$($user.userprincipalname)'"

我不知道原因,但此处还有一些关于哪些语法与Get-ADUser无关,以及您使用的scriptblock语法如何与完整配合使用的讨论用户对象但没有PSCustomObject,这里:

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