Functions/Get-M365UserLicenseReport.ps1

function Get-M365UserLicenseReport {
    [CmdletBinding()]
    param ()
    $FriendlyLicenses = @{
    'O365_BUSINESS_ESSENTIALS'             = 'Office 365 Business Essentials'
    'O365_BUSINESS_PREMIUM'                 = 'Office 365 Business Premium'
    'DESKLESSPACK'                         = 'Office 365 (Plan K1)'
    'DESKLESSWOFFPACK'                     = 'Office 365 (Plan K2)'
    'LITEPACK'                             = 'Office 365 (Plan P1)'
    'EXCHANGESTANDARD'                     = 'Office 365 Exchange Online Only'
    'STANDARDPACK'                         = 'Enterprise Plan E1'
    'STANDARDWOFFPACK'                     = 'Office 365 (Plan E2)'
    'ENTERPRISEPACK'                     = 'Enterprise Plan E3'
    'ENTERPRISEPACKLRG'                     = 'Enterprise Plan E3'
    'ENTERPRISEWITHSCAL'                 = 'Enterprise Plan E4'
    'STANDARDPACK_STUDENT'                 = 'Office 365 (Plan A1) for Students'
    'STANDARDWOFFPACKPACK_STUDENT'         = 'Office 365 (Plan A2) for Students'
    'ENTERPRISEPACK_STUDENT'             = 'Office 365 (Plan A3) for Students'
    'ENTERPRISEWITHSCAL_STUDENT'         = 'Office 365 (Plan A4) for Students'
    'STANDARDPACK_FACULTY'                 = 'Office 365 (Plan A1) for Faculty'
    'STANDARDWOFFPACKPACK_FACULTY'         = 'Office 365 (Plan A2) for Faculty'
    'ENTERPRISEPACK_FACULTY'             = 'Office 365 (Plan A3) for Faculty'
    'ENTERPRISEWITHSCAL_FACULTY'         = 'Office 365 (Plan A4) for Faculty'
    'ENTERPRISEPACK_B_PILOT'             = 'Office 365 (Enterprise Preview)'
    'STANDARD_B_PILOT'                     = 'Office 365 (Small Business Preview)'
    'VISIOCLIENT'                         = 'Visio Pro Online'
    'POWER_BI_ADDON'                     = 'Office 365 Power BI Addon'
    'POWER_BI_INDIVIDUAL_USE'             = 'Power BI Individual User'
    'POWER_BI_STANDALONE'                 = 'Power BI Stand Alone'
    'POWER_BI_STANDARD'                     = 'Power-BI Standard'
    'PROJECTESSENTIALS'                     = 'Project Lite'
    'PROJECTCLIENT'                         = 'Project Professional'
    'PROJECTONLINE_PLAN_1'                 = 'Project Online'
    'PROJECTONLINE_PLAN_2'                 = 'Project Online and PRO'
    'ProjectPremium'                     = 'Project Online Premium'
    'ECAL_SERVICES'                         = 'ECAL'
    'EMS'                                 = 'Enterprise Mobility Suite'
    'RIGHTSMANAGEMENT_ADHOC'             = 'Windows Azure Rights Management'
    'MCOMEETADV'                         = 'PSTN conferencing'
    'SHAREPOINTSTORAGE'                     = 'SharePoint storage'
    'PLANNERSTANDALONE'                     = 'Planner Standalone'
    'CRMIUR'                             = 'CMRIUR'
    'BI_AZURE_P1'                         = 'Power BI Reporting and Analytics'
    'INTUNE_A'                             = 'Windows Intune Plan A'
    'PROJECTWORKMANAGEMENT'                 = 'Office 365 Planner Preview'
    'ATP_ENTERPRISE'                     = 'Exchange Online Advanced Threat Protection'
    'EQUIVIO_ANALYTICS'                     = 'Office 365 Advanced eDiscovery'
    'AAD_BASIC'                             = 'Azure Active Directory Basic'
    'RMS_S_ENTERPRISE'                     = 'Azure Active Directory Rights Management'
    'AAD_PREMIUM'                         = 'Azure Active Directory Premium'
    'MFA_PREMIUM'                         = 'Azure Multi-Factor Authentication'
    'STANDARDPACK_GOV'                     = 'Microsoft Office 365 (Plan G1) for Government'
    'STANDARDWOFFPACK_GOV'                 = 'Microsoft Office 365 (Plan G2) for Government'
    'ENTERPRISEPACK_GOV'                 = 'Microsoft Office 365 (Plan G3) for Government'
    'ENTERPRISEWITHSCAL_GOV'             = 'Microsoft Office 365 (Plan G4) for Government'
    'DESKLESSPACK_GOV'                     = 'Microsoft Office 365 (Plan K1) for Government'
    'ESKLESSWOFFPACK_GOV'                 = 'Microsoft Office 365 (Plan K2) for Government'
    'EXCHANGESTANDARD_GOV'                 = 'Microsoft Office 365 Exchange Online (Plan 1) only for Government'
    'EXCHANGEENTERPRISE_GOV'             = 'Microsoft Office 365 Exchange Online (Plan 2) only for Government'
    'SHAREPOINTDESKLESS_GOV'             = 'SharePoint Online Kiosk'
    'EXCHANGE_S_DESKLESS_GOV'             = 'Exchange Kiosk'
    'RMS_S_ENTERPRISE_GOV'                 = 'Windows Azure Active Directory Rights Management'
    'OFFICESUBSCRIPTION_GOV'             = 'Office ProPlus'
    'MCOSTANDARD_GOV'                     = 'Lync Plan 2G'
    'SHAREPOINTWAC_GOV'                     = 'Office Online for Government'
    'SHAREPOINTENTERPRISE_GOV'             = 'SharePoint Plan 2G'
    'EXCHANGE_S_ENTERPRISE_GOV'             = 'Exchange Plan 2G'
    'EXCHANGE_S_ARCHIVE_ADDON_GOV'         = 'Exchange Online Archiving'
    'EXCHANGE_S_DESKLESS'                 = 'Exchange Online Kiosk'
    'SHAREPOINTDESKLESS'                 = 'SharePoint Online Kiosk'
    'SHAREPOINTWAC'                         = 'Office Online'
    'YAMMER_ENTERPRISE'                     = 'Yammer for the Starship Enterprise'
    'EXCHANGE_L_STANDARD'                 = 'Exchange Online (Plan 1)'
    'MCOLITE'                             = 'Lync Online (Plan 1)'
    'SHAREPOINTLITE'                     = 'SharePoint Online (Plan 1)'
    'OFFICE_PRO_PLUS_SUBSCRIPTION_SMBIZ' = 'Office ProPlus'
    'EXCHANGE_S_STANDARD_MIDMARKET'         = 'Exchange Online (Plan 1)'
    'MCOSTANDARD_MIDMARKET'                 = 'Lync Online (Plan 1)'
    'SHAREPOINTENTERPRISE_MIDMARKET'     = 'SharePoint Online (Plan 1)'
    'OFFICESUBSCRIPTION'                 = 'Office ProPlus'
    'YAMMER_MIDSIZE'                     = 'Yammer'
    'DYN365_ENTERPRISE_PLAN1'             = 'Dynamics 365 Customer Engagement Plan Enterprise Edition'
    'ENTERPRISEPREMIUM_NOPSTNCONF'         = 'Enterprise E5 (without Audio Conferencing)'
    'ENTERPRISEPREMIUM'                     = 'Enterprise E5 (with Audio Conferencing)'
    'MCOSTANDARD'                         = 'Skype for Business Online Standalone Plan 2'
    'PROJECT_MADEIRA_PREVIEW_IW_SKU'     = 'Dynamics 365 for Financials for IWs'
    'STANDARDWOFFPACK_IW_STUDENT'         = 'Office 365 Education for Students'
    'STANDARDWOFFPACK_IW_FACULTY'         = 'Office 365 Education for Faculty'
    'EOP_ENTERPRISE_FACULTY'             = 'Exchange Online Protection for Faculty'
    'EXCHANGESTANDARD_STUDENT'             = 'Exchange Online (Plan 1) for Students'
    'OFFICESUBSCRIPTION_STUDENT'         = 'Office ProPlus Student Benefit'
    'STANDARDWOFFPACK_FACULTY'             = 'Office 365 Education E1 for Faculty'
    'STANDARDWOFFPACK_STUDENT'             = 'Microsoft Office 365 (Plan A2) for Students'
    'DYN365_FINANCIALS_BUSINESS_SKU'     = 'Dynamics 365 for Financials Business Edition'
    'DYN365_FINANCIALS_TEAM_MEMBERS_SKU' = 'Dynamics 365 for Team Members Business Edition'
    'FLOW_FREE'                             = 'Microsoft Flow Free'
    'POWER_BI_PRO'                         = 'Power BI Pro'
    'O365_BUSINESS'                         = 'Office 365 Business'
    'DYN365_ENTERPRISE_SALES'             = 'Dynamics Office 365 Enterprise Sales'
    'RIGHTSMANAGEMENT'                     = 'Rights Management'
    'PROJECTPROFESSIONAL'                 = 'Project Professional'
    'VISIOONLINE_PLAN1'                     = 'Visio Online Plan 1'
    'EXCHANGEENTERPRISE'                 = 'Exchange Online Plan 2'
    'DYN365_ENTERPRISE_P1_IW'             = 'Dynamics 365 P1 Trial for Information Workers'
    'DYN365_ENTERPRISE_TEAM_MEMBERS'     = 'Dynamics 365 For Team Members Enterprise Edition'
    'CRMSTANDARD'                         = 'Microsoft Dynamics CRM Online Professional'
    'EXCHANGEARCHIVE_ADDON'                 = 'Exchange Online Archiving For Exchange Online'
    'EXCHANGEDESKLESS'                     = 'Exchange Online Kiosk'
    'SPZA_IW'                             = 'App Connect'
    'WINDOWS_STORE'                         = 'Windows Store for Business'
    'MCOEV'                                 = 'Microsoft Phone System'
    'VIDEO_INTEROP'                         = 'Polycom Skype Meeting Video Interop for Skype for Business'
    'SPE_E5'                             = 'Microsoft 365 E5'
    'SPE_E3'                             = 'Microsoft 365 E3'
    'ATA'                                 = 'Advanced Threat Analytics'
    'MCOPSTN2'                             = 'Domestic and International Calling Plan'
    'FLOW_P1'                             = 'Microsoft Flow Plan 1'
    'FLOW_P2'                             = 'Microsoft Flow Plan 2'
    'DeveloperPack'                         = 'OFFICE 365 ENTERPRISE E3 DEVELOPER'
    'EMSPremium'                         = 'ENTERPRISE MOBILITY + SECURITY E5'
    'RightsManagemnt'                     = 'AZURE INFORMATION PROTECTION PLAN 1'
    'DYN365_ENTERPRISE_CUSTOMER_SERVICE' = 'DYNAMICS 365 FOR CUSTOMER SERVICE ENTERPRISE EDITION'
    'POWERFLOW_P1'                         = 'Microsoft PowerApps Plan 1'
    'POWERFLOW_P2'                         = 'Microsoft PowerApps Plan 2'
    'AAD_PREMIUM_P1'                     = 'Azure Active Directory Premium P1'
    'AAD_PREMIUM_P2'                     = 'Azure Active Directory Premium P2'
    'TEAMS_EXPLORATORY'                     = 'Teams Exploratory'
    'MDATP_XPLAT'                         = 'Microsoft Defender for Endpoint P2'
    'DEVELOPERPACK_E5'                   = 'Microsoft 365 E5 Developer'    
}
$RequiredScopes = 'Directory.Read.All'
Set-M365MGGraphConnectionScopes -RequiredScopes $RequiredScopes
Select-MgProfile Beta
[Array]$Users = Get-MGUser -All
$i = 1
$UserLicenseReport = [System.Collections.Generic.List[PsObject]]::new()
foreach ($user in $Users)
{
    Write-Progress -Activity "Processing User License details" -Status "Working on $($user.displayname)" -PercentComplete (($i / $Users.Count) * 100)
    $UserLicenseDetails = Get-MgUserLicenseDetail -UserId $user.id    
    $UserLicenseDetails | ForEach-Object {                    
                        $LicenseName = $FriendlyLicenses[$_.SkuPartNumber]                        
                        $UserLicenseReport.Add([pscustomobject]@{
                            DisplayName = $user.DisplayName
                            UserPrincipalName = $user.UserPrincipalName
                            Id = $user.id
                            FriendlyLicenseName = $LicenseName
                            SkuPartNumber = $_.SkuPartNumber
                        })
                    }
    $i++
}  
    $UserLicenseReport
    Write-Warning "Please remember to disconnect from the Microsoft Graph by using 'Disconnect-MGGraph'"
}