Table of Contents
In this post, I will show you several ways to get the license expiration dates of all Microsoft 365 subscriptions in your Office 36 tenant.
Method 1: Getting from Microsoft 365 admin center
The simplest way is gotten it from Microsoft 365 admin center | Billing | Your products.
Login at https://admin.microsoft.com/ using an administrative account. If you didn’t see the Subscriptions status, you can enable it from Choose column option.
Method 2: Getting from Graph Explorer
The second way is to get it from Microsoft Graph Explorer. You can access the Graph Explorer at https://aka.ms/ge.
Below is the Graph API endpoint URL that we can use to retrieve your tenant’s subscription information, including the nextLifecycleDateTime property (the expiration date).
GET https://graph.microsoft.com/beta/directory/subscriptions
For instance, you can see the below screenshot with the response after calling the endpoint resource.
Method 3: Getting using Microsoft Graph PowerShell SDK
To get the list of subscriptions in Microsoft 365, you can use the Microsoft Graph PowerShell. To ease your work, we have created a PowerShell script to do it automatically.
Script Highlights:
- Install the required Microsoft Graph PowerShell SDK modules upon your confirmation.
- Output options direct to the console, export to a CSV file, or open in the graphical grid view.
- Report with license license friendly name instead of a part number or SKU.
Click on the below button to get the code snippet. Then create your own PowerShell script.
# Install the required Microsoft Graph PowerShell SDK modules
Set-ExecutionPolicy Bypass -Scope Process -Force | Out-Null
iex "& { $(irm https://bonguides.com/graph/modulesinstall) } -InstallLicMgmt"
# Create the report with the renewal information
iex "& { $(irm https://bonguides.com/graph/license-report) } "
# Output options to s CSV file or graphical grid view
# iex "& { $(irm https://bonguides.com/graph/modulesinstall) } -OutCSV"
# iex "& { $(irm https://bonguides.com/graph/modulesinstall) } -OutGridView"
# Output
LicenseName SkuPartNumber SkuId ActiveUnits ConsumedUnits RenewalDate
----------- ------------- ----- ----------- ------------- -----------
Enterprise Mobility + Security E5 EMSPREMIUM b05e124f-c7cc-45a0-a6aa-8cf78c946968 20 19 8/13/2024 12:00:00 AM
Office 365 E5 ENTERPRISEPREMIUM c7df2760-2c81-4ef7-b578-5b5392b571df 20 0 8/13/2024 12:00:00 AM
Office 365 E3 ENTERPRISEPACK 6fd2c87f-b296-42f0-b197-1e91e994b900 2 0 8/13/2024 12:00:00 AM
Microsoft Power Automate Free FLOW_FREE f30db892-07e9-47e9-837c-80727f46fd3d 10000 1
Windows 10/11 Enterprise E3 Win10_VDA_E3 6a0f6da5-0b87-4190-a6ae-9bb5a2b9546a 20 19 8/14/2024 12:00:00 AM
Office 365 E5 Without Audio Conferencing ENTERPRISEPREMIUM_NOPSTNCONF 26d45bd9-adf1-46cd-a9e1-51e9a5524128 25 19 10/3/2024 12:00:00 AM
Microsoft 365 E5 Compliance INFORMATION_PROTECTION_COMPLIANCE 184efa21-98c3-4e5d-95ab-d07053a96e67 20 19 8/14/2024 12:00:00 AM
Method 4: Getting using Microsoft Graph API
Alternatively, we can use the Microsoft Graph Rest API to export the subscription information. When using this method:
- We don’t need to install any modules of the Microsoft Graph PowerShell SDK (~ 80 modules).
- We can do it from any machine with Microsoft PowerShell/ PowerShell Core installed (Linux and macOS). Because it uses the native PowerShell cmdlet Invoke-RestMethod to make a request.
- Instead of using an account for authentication and authorization, we use the app-only access (access without a user).
Once the app has been created, replace your app’s information (clientId, tenantId and the clientSecret) into the below code. Steps in this code:
- Get access token ($token) with app registration client secret.
- Create the request header ($headers) for API call.
- Create requests to the Microsoft Graph resource ($uri) with pagination to get all data.
- Build the report ($result) from API call response.
- Output options to console, graphical grid view or export to CSV file.
# Get access token with app registration client secret.
$clientId = "xxxxxxxxxxxxxxxxxxxxxxxxxx"
$tenantId = "xxxxxxxxxxxxxxxxxxxxxxxxxx"
$clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxx"
$uri = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
$body = @{
Grant_Type = "client_credentials"
Scope = "https://graph.microsoft.com/.default"
client_Id = $clientId
Client_Secret = $clientSecret
}
$tokenRequest = Invoke-RestMethod -Uri $uri -Method POST -Body $body
$token = $tokenRequest.access_token
# Create the request header for API call.
$headers = @{
"Authorization" = "Bearer $token"
"Content-Type" = "application/json"
}
# Get the basic information about tenant subscriptions
$subscribedUri = 'https://graph.microsoft.com/beta/subscribedSkus'
$skus = (Invoke-RestMethod -Method GET -Headers $headers -Uri $subscribedUri).Value
# Get the renewal data
$uri = 'https://graph.microsoft.com/beta/directory/subscriptions'
$renewalData = (Invoke-RestMethod -Method GET -Headers $headers -Uri $uri).Value
# Update the report with the renewal information
$report = @()
foreach ($sku in $skus) {
$expireDate = $renewalData | Where-Object {$_.skuId -match $($sku.SkuId)}
if ($expireDate.nextLifecycleDateTime) {
$DaysToRenewal = ($expireDate.nextLifecycleDateTime - $((Get-Date).Date)).Days
}
$object = [PSCustomObject][Ordered]@{
SkuPartNumber = $Sku.SkuPartNumber
SkuId = $Sku.SkuId
ActiveUnits = $Sku.PrepaidUnits.Enabled
WarningUnits = $Sku.PrepaidUnits.Warning
ConsumedUnits = $Sku.ConsumedUnits
RenewalDate = $expireDate.nextLifecycleDateTime
DaysToRenewal = $DaysToRenewal
}
$report += $object
}
$report | Format-Table SkuPartNumber, ActiveUnits, ConsumedUnits, "RenewalDate", "DaysToRenewal"
# Output
SkuPartNumber ActiveUnits ConsumedUnits RenewalDate DaysToRenewal
------------- ----------- ------------- ----------- -------------
EMSPREMIUM 20 19 8/13/2024 12:00:00 AM 299
ENTERPRISEPREMIUM 20 0 8/13/2024 12:00:00 AM 299
ENTERPRISEPACK 2 0 8/13/2024 12:00:00 AM 299
FLOW_FREE 10000 1 299
Win10_VDA_E3 20 19 8/14/2024 12:00:00 AM 300
ENTERPRISEPREMIUM_NOPSTNCONF 25 19 10/3/2024 12:00:00 AM 350
INFORMATION_PROTECTION_COMPLIANCE 20 19 8/14/2024 12:00:00 AM 300
Manage Microsoft 365 Using Microsoft Graph
You can also take a look at the following Microsoft Graph posts that help to manage Microsoft 365 efficiently.
- Create a new user
- Create bulk users in Microsoft 365
- Get a list of all users in Microsoft 365
- Update user properties
- Add a user to a group
- Add bulk users to a group
- Remove users from a group
- Remove multiple users from a group
- Assign managers for Microsoft 365 users
- Assign licenses to users
- Removing licenses from user accounts
- Delete a user from Microsoft 365
- How to use Get-MgUser cmdlet
Not a reader? Watch this related video tutorial: