我使用以下内容仅定位具有所有指定条件的相关用户。
$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值的用户。
我猜这是因为这是一个多值属性?任何想法我需要用什么语法来解决这个问题?
答案 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。用过的。