O365 – Relatórios de licenciamento de usuários vs. serviços utilizados

By: Allan Silva, Rodolfo Lima, Caio Ribeiro Cesar e Eduardo Almeida

Para um melhor entendimento deste post, sugerimos a leitura do conteúdo TechNet .

Diversos clientes possuem a necessidade de coletar relatórios de licenciamento para o O365. A melhor opção neste cenário, é a utilização da ferramenta de reports localizada no Portal do Administrador (O365>Reports>Licenciamento vs. Uso Ativo).

asdasd

Esta opção pode não atender todas as necessidades. O motivo real é que o relatório capturado pela interface gráfica, coleta informações de SKUs do O365. Se o tenant possuir integração com outros produtos O365 (como é o caso de CRM, POWERBI) o relatório de utilização de licenciamento deve ser coletado via powershell.

Vamos primeiro ao entendimento de como coletar as informações básicas de licença e utilização vs. usuários.

1) O commando “Get-MsolAccountSku” irá trazer as informações gerais de licenciamento:

AccountSkuId                   ActiveUnits WarningUnits ConsumedUnits

------------                   ----------- ------------ -------------

crmlatam:DMENTERPRISE          20          0            12

crmlatam:CRMSTANDARD           30          0            25

crmlatam:CRMTESTINSTANCE       10          0            0

crmlatam:O365_BUSINESS_PREMIUM 25          0            22

crmlatam:POWER_BI_STANDARD     1000000     0            2

crmlatam:CRMINSTANCE           2           0            0

crmlatam:NBPROFESSIONAL        10          0            6

crmlatam:CRMSTORAGE            15          0            0

crmlatam:NBENTERPRISE          25          0            3

 

2) Cada licença pode possuir serviços diferentes. Como é o exemplo das licenças abaixo e seus respectivos serviços:

(Get-MsolAccountSku | where {$_.AccountSkuId -eq 'crmlatam:O365_BUSINESS_PREMIUM'}).ServiceStatus

ServicePlan         ProvisioningStatus

-----------         ------------------

SWAY                Success

INTUNE_O365         PendingActivation

SHAREPOINTWAC       Success

OFFICE_BUSINESS     Success

YAMMER_ENTERPRISE   Success

EXCHANGE_S_STANDARD Success

MCOSTANDARD         Success

SHAREPOINTSTANDARD  Success

 

(Get-MsolAccountSku | where {$_.AccountSkuId -eq 'crmlatam:CRMSTANDARD'}).ServiceStatus

 

ServicePlan             ProvisioningStatus

-----------             ------------------

MDM_SALES_COLLABORATION Success

NBPROFESSIONALFORCRM    Success

CRMSTANDARD             Success

 

3) Desta maneira, para coletar as informações de serviço específico habilitado em cada licença vs. usuários, pode não ser tão simples.

Para isto, vamos primeiro coletar esta informação para um usuário específico.

Get-MsolUser -UserPrincipalName allands@crmlatam.onmicrosoft.com | Select-Object -ExpandProperty Licenses

 

ExtensionData          : System.Runtime.Serialization.ExtensionDataObject

AccountSku             : Microsoft.Online.Administration.AccountSkuIdentifier

AccountSkuId           : crmlatam:O365_BUSINESS_PREMIUM

GroupsAssigningLicense : {}

ServiceStatus          : {Microsoft.Online.Administration.ServiceStatus, Microsoft.Online.Administration.ServiceStatus, Microsoft.Online.Administration.ServiceStatus,

Microsoft.Online.Administration.ServiceStatus...}

 

ExtensionData          : System.Runtime.Serialization.ExtensionDataObject

AccountSku             : Microsoft.Online.Administration.AccountSkuIdentifier

AccountSkuId           : crmlatam:NBENTERPRISE

GroupsAssigningLicense : {}

ServiceStatus          : {Microsoft.Online.Administration.ServiceStatus}

 

ExtensionData          : System.Runtime.Serialization.ExtensionDataObject

AccountSku             : Microsoft.Online.Administration.AccountSkuIdentifier

AccountSkuId           : crmlatam:CRMSTANDARD

GroupsAssigningLicense : {}

ServiceStatus          : {Microsoft.Online.Administration.ServiceStatus, Microsoft.Online.Administration.ServiceStatus, Microsoft.Online.Administration.ServiceStatus}

 

ExtensionData          : System.Runtime.Serialization.ExtensionDataObject

AccountSku             : Microsoft.Online.Administration.AccountSkuIdentifier

AccountSkuId           : crmlatam:DMENTERPRISE

GroupsAssigningLicense : {}

ServiceStatus          : {Microsoft.Online.Administration.ServiceStatus}

 

Podemos ver que o atributo de “ServiceStatus” deve ser expandido. Para isso, podemos seguir o comando abaixo:

 

Get-MsolUser -UserPrincipalName allands@crmlatam.onmicrosoft.com | Select-Object -ExpandProperty Licenses | Select-Object -ExpandProperty ServiceStatus

 

ServicePlan             ProvisioningStatus

-----------             ------------------

SWAY                    Success

INTUNE_O365             PendingActivation

SHAREPOINTWAC           Success

OFFICE_BUSINESS         Success

YAMMER_ENTERPRISE       PendingProvisioning

EXCHANGE_S_STANDARD     Success

MCOSTANDARD             Success

SHAREPOINTSTANDARD      Success

NBENTERPRISE            Success

MDM_SALES_COLLABORATION Disabled

NBPROFESSIONALFORCRM    Disabled

CRMSTANDARD             Success

DMENTERPRISE            Success

 

Para se obter um relatório completo de cada usuário de sua organização, temos que criar variáveis para exportar os dados de maneira correta.

a) Usuários: Podemos criar uma variável (ou filtro) em que somente iremos coletar dados de usuários que possuem uma licença válida. Ex.: $Users = Get-MsolUser | Where-Object { $_.isLicensed -eq "true"}

b) UserPrincipalName: Este valor é muito importante para a coleta dos dados. Sem a informação de UPN, não podemos entender quais serviços estão atribuídos para cada usuário. Ex: $a = $users.userprincipalname

c) ServiceStatus: Este último valor, assim conforme demostramos acima, irá trazer os dados de serviços habilitados. Ex: $b = $users.licenses.servicestatus

Se executarmos as strings “$Users , $a , $b” via PowerShell, podemos validar a coleta de informações. Porém, não está corretamente formatado.

Para utilizar uma formatação, utilize o comando abaixo:

$Users = Get-MsolUser | Where-Object { $_.isLicensed -eq "true"}

foreach ($msolUser in $Users){$UserServiceStatus = $msolUser.Licenses.ServiceStatus

foreach($ServiceStatus in $UserServiceStatus){[PSCustomObject] @{UserPrincipalName = $msolUser.UserPrincipalName

                 ServiceType = $ServiceStatus.ServicePlan.ServiceName

                 Status = $ServiceStatus.ProvisioningStatus

}

         }

     }

(Créditos para o SEE Victor Santana pela criação do script acima)

Se preferir, os comandos acima podem ser salvos em um “.ps1” e consequentemente, executado como “arquivo.ps1 | Export-Csv report.csv” para a coleta de um relatório.

Caso prefira automatizar o processo, existe outro script disponível na URL abaixo.

https://gallery.technet.microsoft.com/scriptcenter/O365-Complete-User-Analysis-58923b80