我试图通过PowerShell为已获得特定产品许可证的用户提供O365输出。
有很多关于如何获取此信息的文章,但未找到解释如何使用多个指定产品获取用户的信息。
到目前为止,我有以下内容(取自here):
Get-MsolUser -All |
Where-Object {
($_.licenses).AccountSkuId -match "EXCHANGEENTERPRISE" `
-and ($_.licenses).AccountSkuId -match "EMS" `
-and ($_.licenses).AccountSkuId -notmatch "ENTERPRISEPACK"
} |
Select-Object displayname,userprincipalname,{$_.Licenses.AccountSkuId} |
Export-Csv "C:\Temp\EOP2+EMSLicensedUsers.csv" -NoTypeInformation
但是,这仍然显示已分配ENTERPRISEPACK的用户。
答案 0 :(得分:1)
PowerShell运算符不像您认为的那样工作。
.AccountSkuId
是值的数组。执行AccountSkuId -notmatch "ENTERPRISEPACK"
并不会告诉您该数组中是否包含"ENTERPRISEPACK"
。它为您提供了该数组中与"ENTERPRISEPACK"
不匹配的所有值。
这是过滤器。尝试执行"1","2","3" -notmatch "3"
以查看我的意思。
因此,即使AccountSkuId
中的一个值与"ENTERPRISEPACK"
不匹配,您仍会获得一些值,并且“某些值”(即非空列表)的计算结果为{{1}在布尔表达式中。
你想写这个:
$true
请注意更改。 Get-MsolUser -All |
Where-Object {
($_.licenses).AccountSkuId -match "EXCHANGEENTERPRISE"
-and ($_.licenses).AccountSkuId -match "EMS"
-and -not (($_.licenses).AccountSkuId -match "ENTERPRISEPACK")
} |
Select-Object displayname,userprincipalname,{$_.Licenses.AccountSkuId} |
Export-Csv "C:\Temp\EOP2+EMSLicensedUsers.csv" -NoTypeInformation
为您提供与($_.licenses).AccountSkuId -match "ENTERPRISEPACK"
匹配的所有值(通常为1或0),而"ENTERPRISEPACK"
只会否定该结果。
使用PowerShell运算符尝试的其他事项:
-not
1,2,2,3 -eq 2
1,2,2,3 -ne 2
1,2,2,3 -gt 1
"hallo","hello","foo" -like "*ll*"
请记住,PowerShell可以在列表上运行。单个值只是长度为1的列表。