View on GitHub

azure-ad-license-status

Creates an Azure AD license report based on license assignments and consumption

1 Introduction | 2 Features | 3 Requirements | 4 Preparations | 5 Usage | 6 Examples

6 Examples

6.1 Example calls

6.1.1 Basic example with default settings

Prepares a status report with default values by using only necessary parameters for authentication and report delivery

$directoryID = '00000000-0000-0000-0000-000000000000'
$applicationID = '00000000-0000-0000-0000-000000000000'
$certificateThumbprint = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
$senderAddress = 'sender@example.com'
$recipientAddresses_normal = @(
    'recipient_1@example.com'
    'recipient_2@example.com'
)

Get-AzureADLicenseStatus -DirectoryID $directoryID -ApplicationID $applicationID -CertificateThumbprint $certificateThumbprint -SenderAddress $senderAddress -RecipientAddresses_normal $recipientAddresses_normal

6.1.2 Basic example with modified thresholds

Prepares a status report with customized thresholds for larger organizations and additional recipients for when license counts reach critical levels

$directoryID = '00000000-0000-0000-0000-000000000000'
$applicationID = '00000000-0000-0000-0000-000000000000'
$certificateThumbprint = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
$senderAddress = 'sender@example.com'
$recipientAddresses_normal = @(
    'recipient_1@example.com'
    'recipient_2@example.com'
)
$recipientAddresses_critical = @(
    'recipient_3@example.com'
    'recipient_4@example.com'
)
$skuPercentageThreshold_normal = 1
$skuTotalThreshold_normal = 100
$skuPercentageThreshold_important = 1
$skuTotalThreshold_important = 500

Get-AzureADLicenseStatus -DirectoryID $directoryID -ApplicationID $applicationID -CertificateThumbprint $certificateThumbprint -SenderAddress $senderAddress -RecipientAddresses_normal $recipientAddresses_normal -RecipientAddresses_critical $recipientAddresses_critical -SKUPercentageThreshold_normal $skuPercentageThreshold_normal -SKUTotalThreshold_normal $skuTotalThreshold_normal -SKUPercentageThreshold_important $skuPercentageThreshold_important -SKUTotalThreshold_important $skuTotalThreshold_important

6.1.3 Advanced example

Prepares a status report by using an Azure certificate for automation purposes, specifying both important and interchangeable SKUs and activating advanced checkups

$directoryID = '00000000-0000-0000-0000-000000000000'
$applicationID = '00000000-0000-0000-0000-000000000000'
$subscriptionID = '00000000-0000-0000-0000-000000000000'
$keyVaultName = 'MyKeyVault'
$certificateName = 'MyCertificate'
$senderAddress = 'sender@example.com'
$recipientAddresses_normal = @(
    'recipient_1@example.com'
    'recipient_2@example.com'
)
$recipientAddresses_critical = @(
    'recipient_3@example.com'
    'recipient_4@example.com'
)
$skuPercentageThreshold_normal = 1
$skuTotalThreshold_normal = 100
$skuPercentageThreshold_important = 1
$skuTotalThreshold_important = 500
$importantSKUs = @(
    '18181a46-0d4e-45cd-891e-60aabd171b4e'
    '6fd2c87f-b296-42f0-b197-1e91e994b900'
)
$interchangeableSKUs = @(
    '4b585984-651b-448a-9e53-3b10f069cf7f'
    '18181a46-0d4e-45cd-891e-60aabd171b4e'
    '6fd2c87f-b296-42f0-b197-1e91e994b900'
    'c7df2760-2c81-4ef7-b578-5b5392b571df'
)

Get-AzureADLicenseStatus -DirectoryID $directoryID -ApplicationID $applicationID -SubscriptionID $subscriptionID -KeyVaultName $keyVaultName -CertificateName $certificateName -SenderAddress $senderAddress -RecipientAddresses_normal $recipientAddresses_normal -RecipientAddresses_critical $recipientAddresses_critical -SKUPercentageThreshold_normal $skuPercentageThreshold_normal -SKUTotalThreshold_normal $skuTotalThreshold_normal -SKUPercentageThreshold_important $skuPercentageThreshold_important -SKUTotalThreshold_important $skuTotalThreshold_important -ImportantSKUs $importantSKUs -InterchangeableSKUs $interchangeableSKUs -AdvancedCheckups

6.1.4 Complete example

Prepares a status report by using an Azure certificate for automation purposes, specifying important, interchangeable and preferable SKUs with their prices and activating advanced checkups

$directoryID = '00000000-0000-0000-0000-000000000000'
$applicationID = '00000000-0000-0000-0000-000000000000'
$subscriptionID = '00000000-0000-0000-0000-000000000000'
$keyVaultName = 'MyKeyVault'
$certificateName = 'MyCertificate'
$senderAddress = 'sender@example.com'
$recipientAddresses_normal = @(
    'recipient_1@example.com'
    'recipient_2@example.com'
)
$recipientAddresses_critical = @(
    'recipient_3@example.com'
    'recipient_4@example.com'
)
$skuPercentageThreshold_normal = 1
$skuTotalThreshold_normal = 100
$skuPercentageThreshold_important = 1
$skuTotalThreshold_important = 500
$importantSKUs = @(
    '18181a46-0d4e-45cd-891e-60aabd171b4e'
    '6fd2c87f-b296-42f0-b197-1e91e994b900'
)
$interchangeableSKUs = @(
    '4b585984-651b-448a-9e53-3b10f069cf7f'
    '18181a46-0d4e-45cd-891e-60aabd171b4e'
    '6fd2c87f-b296-42f0-b197-1e91e994b900'
    'c7df2760-2c81-4ef7-b578-5b5392b571df'
)
$preferableSKUs = @(
    [SKURule]@{
        SKUID = [guid]::Empty
        AccountGuest = 'True'
    }
    [SKURule]@{
        SKUID = [guid]::Empty
        CreatedEarlierThan = [datetime]::Now.AddYears(-2)
        LastActiveEarlierThan = [datetime]::Now.AddYears(-2)
    }
    [SKURule]@{
        SKUID = '4b585984-651b-448a-9e53-3b10f069cf7f'
        OneDriveGBUsedLessThan = 2
        MailboxGBUsedLessThan = 2
        MailboxHasArchive = 'False'
        WindowsAppUsed = 'False'
        MacAppUsed = 'False'
    }
    [SKURule]@{
        SKUID = '18181a46-0d4e-45cd-891e-60aabd171b4e'
        MailboxGBUsedLessThan = 50
        MailboxHasArchive = 'False'
        WindowsAppUsed = 'False'
        MacAppUsed = 'False'
    }
)
$skuPrices = @(
    [SKUPrice]@{
        SKUID = '4b585984-651b-448a-9e53-3b10f069cf7f'
        Price = 4.0
    }
    [SKUPrice]@{
        SKUID = '18181a46-0d4e-45cd-891e-60aabd171b4e'
        Price = 10.0
    }
    [SKUPrice]@{
        SKUID = '6fd2c87f-b296-42f0-b197-1e91e994b900'
        Price = 23.0
    }
    [SKUPrice]@{
        SKUID = 'c7df2760-2c81-4ef7-b578-5b5392b571df'
        Price = 38.0
    }
)

Get-AzureADLicenseStatus -DirectoryID $directoryID -ApplicationID $applicationID -SubscriptionID $subscriptionID -KeyVaultName $keyVaultName -CertificateName $certificateName -SenderAddress $senderAddress -RecipientAddresses_normal $recipientAddresses_normal -RecipientAddresses_critical $recipientAddresses_critical -SKUPercentageThreshold_normal $skuPercentageThreshold_normal -SKUTotalThreshold_normal $skuTotalThreshold_normal -SKUPercentageThreshold_important $skuPercentageThreshold_important -SKUTotalThreshold_important $skuTotalThreshold_important -ImportantSKUs $importantSKUs -InterchangeableSKUs $interchangeableSKUs -PreferableSKUs $preferableSKUs -SKUPrices $skuPrices -AdvancedCheckups

6.2 Example report

Below example shows how a report might look like, although the example might differ from the actual result due to the manual’s style settings

Basic checkup - Products

Please check license counts for the following product SKUs and reserve additional licenses:

License type Available count Minimum count Difference
Office 365 F3 96 100 -4
Office 365 E1 63 100 -37
Office 365 E3 21 100 -79
Office 365 E5 -13 100 -113

The following criteria were used during the checkup:

  • Check products with >10 total licenses
  • Report normal products having both <10 licenses and <90% of their total licenses available
  • Report important products having both <100 licenses and <90% of their total licenses available

Advanced checkup - Products

Please check license counts for the following product SKUs and reserve additional licenses:

License type Enabled count Needed count Difference
Azure Active Directory Premium P1 200 670 -470
Azure Active Directory Premium P2 100 170 -70
Defender for Office 365 P2 250 260 -10
Intune Device 50 80 -30

The following criteria were used during the checkup:

  • Check Azure AD P1 based on groups using dynamic user membership
  • Check Azure AD P1 based on applications using group-based assignment
  • Check Azure AD P1/P2 based on users covered by Conditional Access
  • Check Azure AD P2 based on users in scope of Privileged Identity Management
  • Check Defender for Office 365 P1/P2 based on protected Exchange Online recipients
  • Check Intune Device based on devices managed by Intune and used by unlicensed users

Basic checkup - Users

Please check license assignments for the following user accounts and mitigate impact:

Account Interchangeable Optimizable Removable
user_1@example.com Office 365 E3
user_2@example.com Office 365 E3
Office 365 E5
Office 365 E3
user_3@example.com Office 365 F3
Office 365 E3

Potential savings when mitigating license assignment impact: 52,30 €

The following criteria were used during the checkup:

  • Check accounts with any number of assigned licenses
  • Report theoretically exclusive licenses as interchangeable, based on specified SKUs
  • Report practically inclusive licenses as optimizable, based on available SKU features
  • Report actually inclusive licenses as removable, based on enabled SKU features

Advanced checkup - Users

Please check license assignments for the following user accounts and mitigate impact:

Account Preferable Replaceable
user_4@example.com N/A Office 365 E3
user_2@example.com Office 365 E1 Office 365 E3
Office 365 E5
user_5@example.com Office 365 F3 Office 365 E1

Potential savings when mitigating license assignment impact: 73,40 €

The following criteria were used during the checkup, in order:

Priority License Account OneDrive Mailbox Apps
Enabled Guest Created Active Storage Storage Archive Windows Mac Mobile Web
1 N/A - True - - - - - - - - -
2 N/A - - <2021‑07‑01 <2021‑07‑01 - - - - - - -
3 Office 365 F3 - - - - <2 GB <2 GB FALSE FALSE FALSE - -
4 Office 365 E1 - - - - - <50 GB FALSE FALSE FALSE - -