PowerShell:具有多值属性的Where-Object条件

时间:2017-10-04 11:24:53

标签: powershell

我使用以下内容仅定位具有所有指定条件的相关用户。

$TargetUsers = Get-ADUser -Filter * -SearchBase $TargetOU -Properties * | Where-Object {$_.adminDescription -eq "Azure_Sync" -and $_.proxyAddresses -notlike "sip*" -and $_.sn -ne $null -and $_."msRTCSIP-PrimaryUserAddress" -ne $null} | Select userPrincipalName, msRTCSIP-PrimaryUserAddress | Sort userPrincipalName

我很确定这会返回所有相关信息,但是,似乎这会返回在proxyAddresses属性中具有sip值的用户。

我猜这是因为这是一个多值属性?任何想法我需要用什么语法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

您可以使用

$_.ProxyAddresses -contains 'sip:User.One@company.com'

如果您有完整的地址,否则我经常使用的“简单”(但稍慢)解决方案是

($_.ProxyAddresses -join ' ') -match 'sip:'

它只是将它作为一个字符串连接在一起,然后检查其中是否存在sip:

答案 1 :(得分:1)

使用-match

如果函数也是针对集合的。它将返回所有匹配,我们可以将其评估为布尔值以满足条件。请注意,它支持正则表达式,因此需要转义特殊字符。 ^是字符串开头的锚点。因此,"^sip"将匹配任何以" sip"。

开头的字符串
... | Where-Object {$_.adminDescription -eq "Azure_Sync" -and !($_.proxyAddresses -match "^sip")

因此,如果括号中的部分找到了SIP地址,则它将评估为true。你想要相反,所以我们用一个!

翻转结果

嵌套Where-Object

你可以做的是有一个嵌套的where子句,它可以用于proxyaddresses的集合。在您的使用案例中,这似乎更多的努力,但作为对此答案的一般回应,它就足够了。

... | Where-Object{$_.adminDescription -eq "Azure_Sync" -and !($_.proxyaddresses |Where-Object{$_ -like "sip*"}) -and ...

因此,如果内部子句找到与sip地址的任何匹配,那么条件将因为!而被评估为false。用过的。