Skip to main content

License reports

Backed by Microsoft Graph with a cached SKU catalog. For full details and examples, run Get-Help <FunctionName> -Detailed.

Add-UserMsolAccountSku

Assign licenses by friendly name (resolved via catalog), SKU part number, or SKU ID to a user.

Syntax

Add-UserMsolAccountSku -UserPrincipalName <String> -License <String[]> [-ForceLicenseCatalogRefresh]
ParameterDescriptionRequired
UserPrincipalNameTarget user UPN or object ID.Yes
LicenseFriendly name, SKU part number, or SKU ID. Accepts multiple values.Yes
ForceLicenseCatalogRefreshRedownload license catalog cache.No

Examples

Add-UserMsolAccountSku -UserPrincipalName 'user@contoso.com' -License 'Microsoft 365 E3'
Add-UserMsolAccountSku -UserPrincipalName 'user@contoso.com' -License 'ENTERPRISEPACK','VISIOCLIENT'
Add-UserMsolAccountSku -UserPrincipalName 'user@contoso.com' -License '18181a46-0d4e-45cd-891e-60aabd171b4e'
note

If the target user has no UsageLocation, Nebula.Core sets it automatically using the UsageLocation key from your configuration (default US, override via %USERPROFILE%\.NebulaCore\settings.psd1). If updating the usage location fails, license assignment stops.

warning

If the tenant does not have units available for the requested license, the assignment is avoided and a warning message is displayed.

Copy-UserMsolAccountSku

Copy all licenses (with disabled plans preserved) from one user to another without removing them from the source.

Syntax

Copy-UserMsolAccountSku -SourceUserPrincipalName <String> -DestinationUserPrincipalName <String>
ParameterDescriptionRequired
SourceUserPrincipalNameSource user UPN or object ID.Yes
DestinationUserPrincipalNameDestination user UPN or object ID.Yes

Example

Copy-UserMsolAccountSku -SourceUserPrincipalName 'user1@contoso.com' -DestinationUserPrincipalName 'user2@contoso.com'

Export-MsolAccountSku

Export all users with assigned licenses to CSV, mapping SKU part numbers to friendly names.

Syntax

Export-MsolAccountSku [-CsvFolder <String>] [-ForceLicenseCatalogRefresh]
ParameterDescriptionRequiredDefault
CsvFolderOutput folder.NoCurrent directory
ForceLicenseCatalogRefreshRedownload the license catalog cache.NoFalse

Example

Export-MsolAccountSku -CsvFolder 'C:\Temp\Reports'

Get-TenantMsolAccountSku

List tenant SKUs with resolved names, totals, consumed, available (net of suspended), and seat states (filter by name or SKU part number).

Syntax

Get-TenantMsolAccountSku [-ForceLicenseCatalogRefresh] [-Filter <String>] [-SampleUsers <Int32>] [-AsTable] [-GridView]
ParameterDescriptionRequiredDefault
ForceLicenseCatalogRefreshRedownload license catalog cache.NoFalse
FilterShow only licenses whose name or SkuPartNumber contains the provided text.No
SampleUsersReturn up to N sample users per license (requires -Filter). Defaults to 5 when specified.No5
AsTableFormat output as a table.NoFalse
GridViewShow output in a GridView window.NoFalse

Example

Get-TenantMsolAccountSku -AsTable
Get-TenantMsolAccountSku -Filter "E3" -AsTable
Get-TenantMsolAccountSku -Filter "E3" -SampleUsers
note

Available is calculated net of suspended seats: (TotalCount - Suspended) - Consumed. The Total column shows a friendly breakdown (Enabled/Suspended), while TotalCount remains the numeric total for scripting.

tip

Need renewal/expiration or billing profile details? Open the Microsoft 365 Admin Center subscriptions page:

https://admin.cloud.microsoft/?#/subscriptions

Get-UserMsolAccountSku

Show licenses assigned to a single user with friendly names.

Syntax

Get-UserMsolAccountSku -UserPrincipalName <String> [-Clipboard] [-ForceLicenseCatalogRefresh]
ParameterDescriptionRequired
UserPrincipalNameTarget UPN or object ID.Yes
ClipboardCopy the resolved license names (fallback: SkuPartNumber) to the clipboard as "License1","License2".No
ForceLicenseCatalogRefreshRedownload license catalog cache.No

Example

Get-UserMsolAccountSku -UserPrincipalName 'user@contoso.com'
'user1@contoso.com','user2@contoso.com' | Get-UserMsolAccountSku
Get-UserMsolAccountSku -UserPrincipalName 'user@contoso.com' -Clipboard

Move-UserMsolAccountSku

Move all licenses (with disabled plans preserved) from one user to another.

Syntax

Move-UserMsolAccountSku -SourceUserPrincipalName <String> -DestinationUserPrincipalName <String>
ParameterDescriptionRequired
SourceUserPrincipalNameSource user UPN or object ID.Yes
DestinationUserPrincipalNameDestination user UPN or object ID.Yes

Example

Move-UserMsolAccountSku -SourceUserPrincipalName 'user1@contoso.com' -DestinationUserPrincipalName 'user2@contoso.com'

Remove-UserMsolAccountSku

Remove licenses from a user by friendly name (resolved via catalog), SKU part number, or SKU ID.

Syntax

Remove-UserMsolAccountSku -UserPrincipalName <String> -License <String[]> [-ForceLicenseCatalogRefresh]
ParameterDescriptionRequired
UserPrincipalNameTarget user UPN or object ID.Yes
LicenseFriendly name, SKU part number, or SKU ID. Accepts multiple values.Yes
ForceLicenseCatalogRefreshRedownload license catalog cache.No
Remove-UserMsolAccountSku -UserPrincipalName <String> -All [-ForceLicenseCatalogRefresh]
ParameterDescriptionRequired
UserPrincipalNameTarget user UPN or object ID.Yes
AllRemove all assigned licenses.Yes
ForceLicenseCatalogRefreshRedownload license catalog cache.No

Examples

Remove-UserMsolAccountSku -UserPrincipalName 'user@contoso.com' -License 'Microsoft 365 E3'
Remove-UserMsolAccountSku -UserPrincipalName 'user@contoso.com' -License 'ENTERPRISEPACK','VISIOCLIENT'
Remove-UserMsolAccountSku -UserPrincipalName 'user@contoso.com' -License '18181a46-0d4e-45cd-891e-60aabd171b4e'
Remove-UserMsolAccountSku -UserPrincipalName 'user@contoso.com' -All

Update-LicenseCatalog

Refresh the local license catalog cache (download SKU mappings).

Syntax

Update-LicenseCatalog [-Force]
ParameterDescription
ForceForce a refresh even if cache exists.

Example

Update-LicenseCatalog -Force

Questions and answers

Can I export licenses/mailboxes without Graph?

No. License functions and some statistics require Microsoft Graph for complete data. Ensure Connect-Nebula requested the right scopes.