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).
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