Powershell:为用户提供多个指定的产品许可证

时间:2018-02-12 13:34:42

标签: powershell office365

我试图通过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的用户。

1 个答案:

答案 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的列表。