mirror of
https://github.com/admindroid-community/powershell-scripts.git
synced 2025-12-17 16:35:19 +00:00
Manage Microsoft 365 licenses and generate reports
Manage Microsoft 365 licenses and generate reports
This commit is contained in:
parent
6da61c9935
commit
4fd98eadda
@ -1,4 +1,23 @@
|
|||||||
|
<#
|
||||||
|
=============================================================================================
|
||||||
|
Name: Office 365 license reporting and management tool
|
||||||
|
Description: This script can perform 10+ Office 365 reporting and management activities
|
||||||
|
Website: o365reports.com
|
||||||
|
|
||||||
|
Script Highlights:
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
1. Generates 5 Office 365 license reports.
|
||||||
|
2. Allows to perform 6 license management actions that includes, adding or removing licenses in bulk.
|
||||||
|
3. License Name is shown with its friendly name like ‘Office 365 Enterprise E3’ rather than ‘ENTERPRISEPACK’.
|
||||||
|
4. The script can be executed with an MFA enabled account too.
|
||||||
|
5. Exports the report result to CSV.
|
||||||
|
6. Exports license assignment and removal log file.
|
||||||
|
7. The script is scheduler-friendly. i.e., you can pass the credentials as a parameter instead of saving them inside the script.
|
||||||
|
|
||||||
|
For detailed Script execution: https://o365reports.com/2021/11/23/office-365-license-reporting-and-management-using-powershell
|
||||||
|
============================================================================================
|
||||||
|
#>
|
||||||
Param
|
Param
|
||||||
(
|
(
|
||||||
[Parameter(Mandatory = $false)]
|
[Parameter(Mandatory = $false)]
|
||||||
@ -17,14 +36,19 @@ Function Open_OutputFile
|
|||||||
{
|
{
|
||||||
if($ActionFlag -eq "Report")
|
if($ActionFlag -eq "Report")
|
||||||
{
|
{
|
||||||
Write-Host Detailed license report is available in: $OutputCSVName -Foregroundcolor Green
|
Write-Host " Detailed license report is available in:" -NoNewline -ForegroundColor Yellow; Write-Host $OutputCSVName `n
|
||||||
Write-Host The report has $ProcessedCount records
|
Write-Host The report has $ProcessedCount records
|
||||||
}
|
Write-Host `n~~ Script prepared by AdminDroid Community ~~`n -ForegroundColor Green
|
||||||
|
Write-Host "~~ Check out " -NoNewline -ForegroundColor Green; Write-Host "admindroid.com" -ForegroundColor Yellow -NoNewline;
|
||||||
|
Write-Host " to get access to 1800+ Microsoft 365 reports. ~~" -ForegroundColor Green `n`n
|
||||||
|
}
|
||||||
elseif($ActionFlag -eq "Mgmt")
|
elseif($ActionFlag -eq "Mgmt")
|
||||||
{
|
{
|
||||||
Write-Host License assignment/removal log file is available in: $OutputCSVName -ForegroundColor Green
|
Write-Host " License assignment/removal log file is available in:" -NoNewline -ForegroundColor Yellow; Write-Host $OutputCSVName
|
||||||
|
Write-Host `n~~ Script prepared by AdminDroid Community ~~`n -ForegroundColor Green
|
||||||
|
Write-Host "~~ Check out " -NoNewline -ForegroundColor Green; Write-Host "admindroid.com" -ForegroundColor Yellow -NoNewline;
|
||||||
|
Write-Host " to get access to 1800+ Microsoft 365 reports. ~~" -ForegroundColor Green `n`n
|
||||||
}
|
}
|
||||||
Write-Host `nFor more Office 365 related PowerShell scripts, check https://o365reports.com -ForegroundColor Cyan
|
|
||||||
$Prompt = New-Object -ComObject wscript.shell
|
$Prompt = New-Object -ComObject wscript.shell
|
||||||
$UserInput = $Prompt.popup("Do you want to open output file?",`
|
$UserInput = $Prompt.popup("Do you want to open output file?",`
|
||||||
0,"Open Output File",4)
|
0,"Open Output File",4)
|
||||||
@ -35,7 +59,10 @@ Function Open_OutputFile
|
|||||||
}
|
}
|
||||||
Else
|
Else
|
||||||
{
|
{
|
||||||
Write-Host No records found
|
Write-Host `nNo records found
|
||||||
|
Write-Host `n~~ Script prepared by AdminDroid Community ~~`n -ForegroundColor Green
|
||||||
|
Write-Host "~~ Check out " -NoNewline -ForegroundColor Green; Write-Host "admindroid.com" -ForegroundColor Yellow -NoNewline;
|
||||||
|
Write-Host " to get access to 1800+ Microsoft 365 reports. ~~" -ForegroundColor Green `n`n
|
||||||
}
|
}
|
||||||
Write-Progress -Activity Export CSV -Completed
|
Write-Progress -Activity Export CSV -Completed
|
||||||
}
|
}
|
||||||
@ -178,7 +205,7 @@ Function main()
|
|||||||
Switch ($GetAction) {
|
Switch ($GetAction) {
|
||||||
1 {
|
1 {
|
||||||
$OutputCSVName=".\O365UserLicenseReport_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
|
$OutputCSVName=".\O365UserLicenseReport_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
|
||||||
Write-Host Generating licensed users report...
|
Write-Host `nGenerating licensed users report...`n
|
||||||
$ProcessedCount=0
|
$ProcessedCount=0
|
||||||
Get-MsolUser -All | where {$_.IsLicensed -eq $true} | foreach {
|
Get-MsolUser -All | where {$_.IsLicensed -eq $true} | foreach {
|
||||||
$ProcessedCount++
|
$ProcessedCount++
|
||||||
@ -195,7 +222,7 @@ Function main()
|
|||||||
|
|
||||||
2 {
|
2 {
|
||||||
$OutputCSVName=".\O365UnlicenedUserReport_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
|
$OutputCSVName=".\O365UnlicenedUserReport_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
|
||||||
Write-Host Generating Unlicensed users report...
|
Write-Host `nGenerating Unlicensed users report...`n
|
||||||
$ProcessedCount=0
|
$ProcessedCount=0
|
||||||
Get-MsolUser -All -UnlicensedUsersOnly | foreach {
|
Get-MsolUser -All -UnlicensedUsersOnly | foreach {
|
||||||
$ProcessedCount++
|
$ProcessedCount++
|
||||||
@ -213,9 +240,9 @@ Function main()
|
|||||||
$OutputCSVName="./O365UsersWithSpecificLicenseReport__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
|
$OutputCSVName="./O365UsersWithSpecificLicenseReport__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
|
||||||
if($LicenseName -eq "")
|
if($LicenseName -eq "")
|
||||||
{
|
{
|
||||||
$LicenseName=Read-Host "Enter the license SKU(Eg:contoso:Enterprisepack)"
|
$LicenseName=Read-Host "`nEnter the license SKU(Eg:contoso:Enterprisepack)"
|
||||||
}
|
}
|
||||||
Write-Host Getting users with $LicenseName license...
|
Write-Host `nGetting users with $LicenseName license...`n
|
||||||
$ProcessedCount=0
|
$ProcessedCount=0
|
||||||
if((Get-MsolAccountSku).AccountSkuID -icontains $LicenseName)
|
if((Get-MsolAccountSku).AccountSkuID -icontains $LicenseName)
|
||||||
{
|
{
|
||||||
@ -242,7 +269,7 @@ Function main()
|
|||||||
4 {
|
4 {
|
||||||
$OutputCSVName="./O365DiabledUsersWithLicense__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
|
$OutputCSVName="./O365DiabledUsersWithLicense__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
|
||||||
$ProcessedCount=0
|
$ProcessedCount=0
|
||||||
Write-Host Finding disabled users still licensed in Office 365...
|
Write-Host `nFinding disabled users still licensed in Office 365...`n
|
||||||
Get-MsolUser -All -EnabledFilter DisabledOnly | where {$_.IsLicensed -eq $true} | foreach {
|
Get-MsolUser -All -EnabledFilter DisabledOnly | where {$_.IsLicensed -eq $true} | foreach {
|
||||||
$ProcessedCount++
|
$ProcessedCount++
|
||||||
Get_UserInfo
|
Get_UserInfo
|
||||||
@ -261,7 +288,7 @@ Function main()
|
|||||||
|
|
||||||
5 {
|
5 {
|
||||||
$OutputCSVName="./Office365LicenseUsageReport__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
|
$OutputCSVName="./Office365LicenseUsageReport__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
|
||||||
Write-Host Generating Office 365 license usage report...
|
Write-Host `nGenerating Office 365 license usage report...`n
|
||||||
$ProcessedCount=0
|
$ProcessedCount=0
|
||||||
Get-MsolAccountSku | foreach {
|
Get-MsolAccountSku | foreach {
|
||||||
$ProcessedCount++
|
$ProcessedCount++
|
||||||
@ -284,14 +311,14 @@ Function main()
|
|||||||
|
|
||||||
6 {
|
6 {
|
||||||
$OutputCSVName="./Office365LicenseAssignment_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt"
|
$OutputCSVName="./Office365LicenseAssignment_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt"
|
||||||
$UserNamesFile=Read-Host "Enter the CSV file containing user names(Eg:D:/UserNames.csv)"
|
$UserNamesFile=Read-Host "`nEnter the CSV file containing user names(Eg:D:/UserNames.csv)"
|
||||||
|
|
||||||
#We have an input file, read it into memory
|
#We have an input file, read it into memory
|
||||||
$UserNames=@()
|
$UserNames=@()
|
||||||
$UserNames=Import-Csv -Header "UPN" $UserNamesFile
|
$UserNames=Import-Csv -Header "UPN" $UserNamesFile
|
||||||
$ProcessedCount=0
|
$ProcessedCount=0
|
||||||
$LicenseNames=Read-Host "Enter the license name(Eg:contoso:Enterprisepack)"
|
$LicenseNames=Read-Host "`nEnter the license name(Eg:contoso:Enterprisepack)"
|
||||||
Write-Host Assigning license to users...
|
Write-Host `nAssigning license to users...`n
|
||||||
if((Get-MsolAccountSku).AccountSkuID -icontains $LicenseNames)
|
if((Get-MsolAccountSku).AccountSkuID -icontains $LicenseNames)
|
||||||
{
|
{
|
||||||
foreach($Item in $UserNames)
|
foreach($Item in $UserNames)
|
||||||
@ -323,14 +350,14 @@ Function main()
|
|||||||
|
|
||||||
7 {
|
7 {
|
||||||
$OutputCSVName="./Office365LicenseAssignment_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt"
|
$OutputCSVName="./Office365LicenseAssignment_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt"
|
||||||
$UserNamesFile=Read-Host "Enter the CSV file containing user names(Eg:D:/UserNames.csv)"
|
$UserNamesFile=Read-Host "`nEnter the CSV file containing user names(Eg:D:/UserNames.csv)"
|
||||||
|
|
||||||
#We have an input file, read it into memory
|
#We have an input file, read it into memory
|
||||||
$UserNames=@()
|
$UserNames=@()
|
||||||
$UserNames=Import-Csv -Header "UPN" $UserNamesFile
|
$UserNames=Import-Csv -Header "UPN" $UserNamesFile
|
||||||
$Flag=""
|
$Flag=""
|
||||||
$ProcessedCount=0
|
$ProcessedCount=0
|
||||||
$LicenseNames=Read-Host "Enter the license names(Eg:TenantName:LicensePlan1,TenantName:LicensePlan2)"
|
$LicenseNames=Read-Host "`nEnter the license names(Eg:TenantName:LicensePlan1,TenantName:LicensePlan2)"
|
||||||
$LicenseNames=$LicenseNames.Replace(' ','')
|
$LicenseNames=$LicenseNames.Replace(' ','')
|
||||||
$LicenseNames=$LicenseNames.split(",")
|
$LicenseNames=$LicenseNames.split(",")
|
||||||
foreach($LicenseName in $LicenseNames)
|
foreach($LicenseName in $LicenseNames)
|
||||||
@ -343,11 +370,11 @@ Function main()
|
|||||||
}
|
}
|
||||||
if($Flag -eq "Terminate")
|
if($Flag -eq "Terminate")
|
||||||
{
|
{
|
||||||
Write-Host Please re-run the script with appropriate license name -ForegroundColor Yellow
|
Write-Host `nPlease re-run the script with appropriate license name -ForegroundColor Yellow
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Write-Host Assigning licenses to Office 365 users...
|
Write-Host `nAssigning licenses to Office 365 users...`n
|
||||||
foreach($Item in $UserNames)
|
foreach($Item in $UserNames)
|
||||||
{
|
{
|
||||||
$UPN=$Item.UPN
|
$UPN=$Item.UPN
|
||||||
@ -373,7 +400,7 @@ Function main()
|
|||||||
|
|
||||||
|
|
||||||
8 {
|
8 {
|
||||||
$Identity=Read-Host Enter User UPN
|
$Identity=Read-Host `nEnter User UPN
|
||||||
$UserInfo=Get-MsolUser -UserPrincipalName $Identity
|
$UserInfo=Get-MsolUser -UserPrincipalName $Identity
|
||||||
#Checking whether the user is available
|
#Checking whether the user is available
|
||||||
if($UserInfo -eq $null)
|
if($UserInfo -eq $null)
|
||||||
@ -385,13 +412,15 @@ Function main()
|
|||||||
$Licenses=$UserInfo.Licenses.AccountSkuID
|
$Licenses=$UserInfo.Licenses.AccountSkuID
|
||||||
Write-Host Removing $Licenses license from $Identity
|
Write-Host Removing $Licenses license from $Identity
|
||||||
Set-MsolUserLicense -UserPrincipalName $Identity -RemoveLicenses $Licenses
|
Set-MsolUserLicense -UserPrincipalName $Identity -RemoveLicenses $Licenses
|
||||||
Write-Host Action completed -ForegroundColor Green
|
Write-Host `nAction completed -ForegroundColor Green
|
||||||
|
Write-Host `n~~ Script prepared by AdminDroid Community ~~`n -ForegroundColor Green
|
||||||
|
Write-Host "~~ Check out " -NoNewline -ForegroundColor Green; Write-Host "admindroid.com" -ForegroundColor Yellow -NoNewline; Write-Host " to get access to 1800+ Microsoft 365 reports. ~~" -ForegroundColor Green `n`n
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
9 {
|
9 {
|
||||||
$OutputCSVName="./Office365LicenseRemoval_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt"
|
$OutputCSVName="./Office365LicenseRemoval_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt"
|
||||||
$UserNamesFile=Read-Host "Enter the CSV file containing user names(Eg:D:/UserNames.csv)"
|
$UserNamesFile=Read-Host "`nEnter the CSV file containing user names(Eg:D:/UserNames.csv)"
|
||||||
|
|
||||||
#We have an input file, read it into memory
|
#We have an input file, read it into memory
|
||||||
$UserNames=@()
|
$UserNames=@()
|
||||||
@ -411,9 +440,9 @@ Function main()
|
|||||||
|
|
||||||
10 {
|
10 {
|
||||||
$OutputCSVName="./O365LicenseRemoval_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt"
|
$OutputCSVName="./O365LicenseRemoval_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt"
|
||||||
$License=Read-Host "Enter the license name(Eg:TenantName:LicensePlan)"
|
$License=Read-Host "`nEnter the license name(Eg:TenantName:LicensePlan)"
|
||||||
$ProcessedCount=0
|
$ProcessedCount=0
|
||||||
Write-Host Removing $License license from users...
|
Write-Host `nRemoving $License license from users...`n
|
||||||
if((Get-MsolAccountSku).AccountSkuID -icontains $License)
|
if((Get-MsolAccountSku).AccountSkuID -icontains $License)
|
||||||
{
|
{
|
||||||
Get-MsolUser -All | Where-Object {($_.licenses).AccountSkuId -eq $License} | foreach{
|
Get-MsolUser -All | Where-Object {($_.licenses).AccountSkuId -eq $License} | foreach{
|
||||||
@ -432,7 +461,7 @@ Function main()
|
|||||||
|
|
||||||
11 {
|
11 {
|
||||||
$OutputCSVName="./O365LicenseRemoval_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt"
|
$OutputCSVName="./O365LicenseRemoval_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt"
|
||||||
Write-Host Removing license from disabled users...
|
Write-Host `nRemoving license from disabled users...`n
|
||||||
$ProcessedCount=0
|
$ProcessedCount=0
|
||||||
Get-MsolUser -All -EnabledFilter DisabledOnly | where {$_.IsLicensed -eq $true} | foreach {
|
Get-MsolUser -All -EnabledFilter DisabledOnly | where {$_.IsLicensed -eq $true} | foreach {
|
||||||
$ProcessedCount++
|
$ProcessedCount++
|
||||||
@ -458,11 +487,4 @@ Function main()
|
|||||||
While ($GetAction -ne 0)
|
While ($GetAction -ne 0)
|
||||||
Clear-Host
|
Clear-Host
|
||||||
}
|
}
|
||||||
. main
|
. main
|
||||||
|
|
||||||
<#
|
|
||||||
=============================================================================================
|
|
||||||
Name: Office 365 license reporting and management using PowerShell
|
|
||||||
For detailed Script execution: https://o365reports.com/2021/11/23/office-365-license-reporting-and-management-using-powershell
|
|
||||||
============================================================================================
|
|
||||||
#>
|
|
||||||
Loading…
x
Reference in New Issue
Block a user