【问题标题】:Unable to filter output of table when querying Office 365 licensing status查询 Office 365 许可状态时无法过滤表的输出
【发布时间】:2025-12-31 20:50:01
【问题描述】:

我正在尝试过滤此命令的输出 (Get-MsolUser -UserPrincipalName ).Licenses.ServiceStatus

看起来像这样:

ServicePlan               ProvisioningStatus
-----------               ------------------
MCOMEETADV                Success
ADALLOM_S_DISCOVERY       Disabled
EXCHANGE_S_FOUNDATION     PendingProvisioning
AAD_PREMIUM               Success
MFA_PREMIUM               Success
ONEDRIVE_BASIC            Success
VISIOONLINE               Success
EXCHANGE_S_FOUNDATION     PendingProvisioning
VISIO_CLIENT_SUBSCRIPTION Success
MCOPSTN1                  Success
EXCHANGE_S_FOUNDATION     PendingProvisioning
DYN365_CDS_VIRAL          Success
FLOW_P2_VIRAL             Success
EXCHANGE_S_FOUNDATION     PendingProvisioning
INTUNE_A                  PendingInput
EXCHANGE_S_FOUNDATION     PendingProvisioning
BI_AZURE_P2               Success
MCOEV                     Success
MICROSOFT_SEARCH          PendingProvisioning
WHITEBOARD_PLAN2          PendingProvisioning
MIP_S_CLP1                PendingProvisioning
MYANALYTICS_P2            Success
BPOS_S_TODO_2             Success
FORMS_PLAN_E3             Success
STREAM_O365_E3            Success
Deskless                  Success
FLOW_O365_P2              Success
POWERAPPS_O365_P2         Success
TEAMS1                    Success
PROJECTWORKMANAGEMENT     Success
SWAY                      Success
INTUNE_O365               PendingActivation
YAMMER_ENTERPRISE         Success
RMS_S_ENTERPRISE          Success
OFFICESUBSCRIPTION        Success
MCOSTANDARD               Success
SHAREPOINTWAC             Success
SHAREPOINTENTERPRISE      Success
EXCHANGE_S_ENTERPRISE     Success

我正在筛选 Exchange_S_Enterprise 和 MCOEV。

我已经尝试过 (Get-MsolUser -UserPrincipalName ).Licenses.ServiceStatus |选择对象交换

我试过 Where-Object

什么都不返回

(Get-MsolUser -UserPrincipalName).Licenses.ServiceStatus

如果 EXCHANGE_S_ENTERPRISE 的配置状态为 -eq "Success",我想做一个 if 语句来继续我的脚本

【问题讨论】:

    标签: powershell office365


    【解决方案1】:

    如果您深入了解某个用户的服务状态,您会发现 ServiceStatus 是一个包含多个子级别的对象。

    您需要访问 ServiceName 来执行您的 Where 声明..

    这是一个工作示例,如果它们的配置状态为 SUCCESS,它将对 MCOEVExchange_S_Enterprise 执行不同的操作。

    $User = Get-MsolUser -UserPrincipalName 'MyUser@MyDomain.com'
    
    $PlanstoCheck = @('MCOEV', ' EXCHANGE_S_ENTERPRISE')
    $Plans = $User.Licenses.ServiceStatus.where( { $_.ServicePlan.ServiceName -in $PlanstoCheck })
    
    Foreach ($Plan in $Plans) {
        if ($Plan.ProvisioningStatus -eq 'SUCCESS') {
            switch ($Plan.ServicePlan.ServiceName) {
                'MCOEV' { Write-Host 'Do thing #1' }
                'EXCHANGE_S_ENTERPRISE' { 'Do THing #2' }
            }
        }
    }
    

    调试时,可以使用F8一次只执行一行。 在您的情况下,在 $User.Licenses.ServiceStatus 加载 MSOL 用户,您可以看到更深的层次。如果您在该级别执行GetType(),您还会注意到您当前的级别不是字符串,而是另一个对象,因此将对象与字符串进行比较没有产生预期结果的原因。

    【讨论】: