From d4f85135605fa44117e1f52e56dd8288277eba83 Mon Sep 17 00:00:00 2001 From: AdminDroid <49208841+admindroid-community@users.noreply.github.com> Date: Tue, 23 Nov 2021 19:18:08 +0530 Subject: [PATCH] Office 365 License Reporting and Management Office 365 License Reporting and Management --- .../LicenseFriendlyName.txt | 239 +++++++++ .../O365LicenseReportingAndManagement.ps1 | 468 ++++++++++++++++++ 2 files changed, 707 insertions(+) create mode 100644 Office365 License Reporting And Management/LicenseFriendlyName.txt create mode 100644 Office365 License Reporting And Management/O365LicenseReportingAndManagement.ps1 diff --git a/Office365 License Reporting And Management/LicenseFriendlyName.txt b/Office365 License Reporting And Management/LicenseFriendlyName.txt new file mode 100644 index 0000000..edddefa --- /dev/null +++ b/Office365 License Reporting And Management/LicenseFriendlyName.txt @@ -0,0 +1,239 @@ +AAD_BASIC= Azure Active Directory Basic + AAD_PREMIUM= Azure Active Directory Premium + AAD_PREMIUM_P1= Azure Active Directory Premium P1 + AAD_PREMIUM_P2= Azure Active Directory Premium P2 + ADALLOM_O365= Office 365 Advanced Security Management + ADALLOM_STANDALONE= Microsoft Cloud App Security + ADALLOM_S_O365= POWER BI STANDALONE + ADALLOM_S_STANDALONE= Microsoft Cloud App Security + ATA= Azure Advanced Threat Protection for Users + ATP_ENTERPRISE= Exchange Online Advanced Threat Protection + ATP_ENTERPRISE_FACULTY= Exchange Online Advanced Threat Protection + BI_AZURE_P0= Power BI (free) + BI_AZURE_P1= Power BI Reporting and Analytics + BI_AZURE_P2= Power BI Pro + CCIBOTS_PRIVPREV_VIRAL= Dynamics 365 AI for Customer Service Virtual Agents Viral SKU + CRMINSTANCE= Microsoft Dynamics CRM Online Additional Production Instance (Government Pricing) + CRMIUR= CRM for Partners + CRMPLAN1= Microsoft Dynamics CRM Online Essential (Government Pricing) + CRMPLAN2= Dynamics CRM Online Plan 2 + CRMSTANDARD= CRM Online + CRMSTORAGE= Microsoft Dynamics CRM Online Additional Storage + CRMTESTINSTANCE= CRM Test Instance + DESKLESS= Microsoft StaffHub + DESKLESSPACK= Office 365 (Plan K1) + DESKLESSPACK_GOV= Microsoft Office 365 (Plan K1) for Government + DESKLESSPACK_YAMMER= Office 365 Enterprise K1 with Yammer + DESKLESSWOFFPACK= Office 365 (Plan K2) + DESKLESSWOFFPACK_GOV= Microsoft Office 365 (Plan K2) for Government + DEVELOPERPACK= Office 365 Enterprise E3 Developer + DEVELOPERPACK_E5= Microsoft 365 E5 Developer(without Windows and Audio Conferencing) + DMENTERPRISE= Microsoft Dynamics Marketing Online Enterprise + DYN365_ENTERPRISE_CUSTOMER_SERVICE= Dynamics 365 for Customer Service Enterprise Edition + DYN365_ENTERPRISE_P1_IW= Dynamics 365 P1 Trial for Information Workers + DYN365_ENTERPRISE_PLAN1= Dynamics 365 Plan 1 Enterprise Edition + DYN365_ENTERPRISE_SALES= Dynamics 365 for Sales Enterprise Edition + DYN365_ENTERPRISE_SALES_CUSTOMERSERVICE= Dynamics 365 for Sales and Customer Service Enterprise Edition + DYN365_ENTERPRISE_TEAM_MEMBERS= Dynamics 365 for Team Members Enterprise Edition + DYN365_FINANCIALS_BUSINESS_SKU= Dynamics 365 for Financials Business Edition + DYN365_MARKETING_USER= Dynamics 365 for Marketing USL + DYN365_MARKETING_APP= Dynamics 365 Marketing + DYN365_SALES_INSIGHTS= Dynamics 365 AI for Sales + D365_SALES_PRO= Dynamics 365 for Sales Professional + Dynamics_365_for_Operations= Dynamics 365 Unf Ops Plan Ent Edition + ECAL_SERVICES= ECAL + EMS= Enterprise Mobility + Security E3 + EMSPREMIUM= Enterprise Mobility + Security E5 + ENTERPRISEPACK= Office 365 Enterprise E3 + ENTERPRISEPACKLRG= Office 365 Enterprise E3 LRG + ENTERPRISEPACKWITHOUTPROPLUS= Office 365 Enterprise E3 without ProPlus Add-on + ENTERPRISEPACK_B_PILOT= Office 365 (Enterprise Preview) + ENTERPRISEPACK_FACULTY= Office 365 (Plan A3) for Faculty + ENTERPRISEPACK_GOV= Microsoft Office 365 (Plan G3) for Government + ENTERPRISEPACK_STUDENT= Office 365 (Plan A3) for Students + ENTERPRISEPREMIUM= Enterprise E5 (with Audio Conferencing) + ENTERPRISEPREMIUM_NOPSTNCONF= Enterprise E5 (without Audio Conferencing) + ENTERPRISEWITHSCAL= Office 365 Enterprise E4 + ENTERPRISEWITHSCAL_FACULTY= Office 365 (Plan A4) for Faculty + ENTERPRISEWITHSCAL_GOV= Microsoft Office 365 (Plan G4) for Government + ENTERPRISEWITHSCAL_STUDENT= Office 365 (Plan A4) for Students + EOP_ENTERPRISE= Exchange Online Protection + EOP_ENTERPRISE_FACULTY= Exchange Online Protection for Faculty + EQUIVIO_ANALYTICS= Office 365 Advanced Compliance + EQUIVIO_ANALYTICS_FACULTY= Office 365 Advanced Compliance for Faculty + ESKLESSWOFFPACK_GOV= Microsoft Office 365 (Plan K2) for Government + EXCHANGEARCHIVE= Exchange Online Archiving + EXCHANGEARCHIVE_ADDON= Exchange Online Archiving for Exchange Online + EXCHANGEDESKLESS= Exchange Online Kiosk + EXCHANGEENTERPRISE= Exchange Online Plan 2 + EXCHANGEENTERPRISE_FACULTY= Exch Online Plan 2 for Faculty + EXCHANGEENTERPRISE_GOV= Microsoft Office 365 Exchange Online (Plan 2) only for Government + EXCHANGEESSENTIALS= Exchange Online Essentials + EXCHANGESTANDARD= Office 365 Exchange Online Only + EXCHANGESTANDARD_GOV= Microsoft Office 365 Exchange Online (Plan 1) only for Government + EXCHANGESTANDARD_STUDENT= Exchange Online (Plan 1) for Students + EXCHANGETELCO= Exchange Online POP + EXCHANGE_ANALYTICS= Microsoft MyAnalytics + EXCHANGE_L_STANDARD= Exchange Online (Plan 1) + EXCHANGE_S_ARCHIVE_ADDON_GOV= Exchange Online Archiving + EXCHANGE_S_DESKLESS= Exchange Online Kiosk + EXCHANGE_S_DESKLESS_GOV= Exchange Kiosk + EXCHANGE_S_ENTERPRISE= Exchange Online (Plan 2) Ent + EXCHANGE_S_ENTERPRISE_GOV= Exchange Plan 2G + EXCHANGE_S_ESSENTIALS= Exchange Online Essentials + EXCHANGE_S_FOUNDATION= Exchange Foundation for certain SKUs + EXCHANGE_S_STANDARD= Exchange Online (Plan 2) + EXCHANGE_S_STANDARD_MIDMARKET= Exchange Online (Plan 1) + FLOW_FREE= Microsoft Flow (Free) + FLOW_O365_P2= Flow for Office 365 + FLOW_O365_P3= Flow for Office 365 + FLOW_P1= Microsoft Flow Plan 1 + FLOW_P2= Microsoft Flow Plan 2 + FORMS_PLAN_E3= Microsoft Forms (Plan E3) + FORMS_PLAN_E5= Microsoft Forms (Plan E5) + INFOPROTECTION_P2= Azure Information Protection Premium P2 + INTUNE_A= Windows Intune Plan A + INTUNE_A_VL= Intune (Volume License) + INTUNE_O365= Mobile Device Management for Office 365 + INTUNE_STORAGE= Intune Extra Storage + IT_ACADEMY_AD= Microsoft Imagine Academy + LITEPACK= Office 365 (Plan P1) + LITEPACK_P2= Office 365 Small Business Premium + LOCKBOX= Customer Lockbox + LOCKBOX_ENTERPRISE= Customer Lockbox + MCOCAP= Command Area Phone + MCOEV= Skype for Business Cloud PBX + MCOIMP= Skype for Business Online (Plan 1) + MCOLITE= Lync Online (Plan 1) + MCOMEETADV= PSTN conferencing + MCOPLUSCAL= Skype for Business Plus CAL + MCOPSTN1= Skype for Business Pstn Domestic Calling + MCOPSTN2= Skype for Business Pstn Domestic and International Calling + MCOSTANDARD= Skype for Business Online Standalone Plan 2 + MCOSTANDARD_GOV= Lync Plan 2G + MCOSTANDARD_MIDMARKET= Lync Online (Plan 1) + MCVOICECONF= Lync Online (Plan 3) + MDM_SALES_COLLABORATION= Microsoft Dynamics Marketing Sales Collaboration + MEE_FACULTY= Minecraft Education Edition Faculty + MEE_STUDENT= Minecraft Education Edition Student + MEETING_ROOM= Meeting Room + MFA_PREMIUM= Azure Multi-Factor Authentication + MICROSOFT_BUSINESS_CENTER= Microsoft Business Center + MICROSOFT_REMOTE_ASSIST= Dynamics 365 Remote Assist + MIDSIZEPACK= Office 365 Midsize Business + MINECRAFT_EDUCATION_EDITION= Minecraft Education Edition Faculty + MS-AZR-0145P= Azure + MS_TEAMS_IW= Microsoft Teams + NBPOSTS= Microsoft Social Engagement Additional 10k Posts (minimum 100 licenses) (Government Pricing) + NBPROFESSIONALFORCRM= Microsoft Social Listening Professional + O365_BUSINESS= Microsoft 365 Apps for business + O365_BUSINESS_ESSENTIALS= Microsoft 365 Business Basic + O365_BUSINESS_PREMIUM= Microsoft 365 Business Standard + OFFICE365_MULTIGEO= Multi-Geo Capabilities in Office 365 + OFFICESUBSCRIPTION= Microsoft 365 Apps for enterprise + OFFICESUBSCRIPTION_FACULTY= Office 365 ProPlus for Faculty + OFFICESUBSCRIPTION_GOV= Office ProPlus + OFFICESUBSCRIPTION_STUDENT= Office ProPlus Student Benefit + OFFICE_FORMS_PLAN_2= Microsoft Forms (Plan 2) + OFFICE_PRO_PLUS_SUBSCRIPTION_SMBIZ= Office ProPlus + ONEDRIVESTANDARD= OneDrive + PAM_ENTERPRISE = Exchange Primary Active Manager + PLANNERSTANDALONE= Planner Standalone + POWERAPPS_INDIVIDUAL_USER= Microsoft PowerApps and Logic flows + POWERAPPS_O365_P2= PowerApps + POWERAPPS_O365_P3= PowerApps for Office 365 + POWERAPPS_VIRAL= PowerApps (Free) + POWERFLOW_P1= Microsoft PowerApps Plan 1 + POWERFLOW_P2= Microsoft PowerApps Plan 2 + POWER_BI_ADDON= Office 365 Power BI Addon + POWER_BI_INDIVIDUAL_USE= Power BI Individual User + POWER_BI_INDIVIDUAL_USER= Power BI for Office 365 Individual + POWER_BI_PRO= Power BI Pro + POWER_BI_STANDALONE= Power BI Standalone + POWER_BI_STANDARD= Power-BI Standard + PREMIUM_ADMINDROID= AdminDroid Office 365 Reporter + PROJECTCLIENT= Project Professional + PROJECTESSENTIALS= Project Lite + PROJECTONLINE_PLAN_1= Project Online (Plan 1) + PROJECTONLINE_PLAN_1_FACULTY= Project Online for Faculty Plan 1 + PROJECTONLINE_PLAN_1_STUDENT= Project Online for Students Plan 1 + PROJECTONLINE_PLAN_2= Project Online and PRO + PROJECTONLINE_PLAN_2_FACULTY= Project Online for Faculty Plan 2 + PROJECTONLINE_PLAN_2_STUDENT= Project Online for Students Plan 2 + PROJECTPREMIUM= Project Online Premium + PROJECTPROFESSIONAL= Project Online Pro + PROJECTWORKMANAGEMENT= Office 365 Planner Preview + PROJECT_CLIENT_SUBSCRIPTION= Project Pro for Office 365 + PROJECT_ESSENTIALS= Project Lite + PROJECT_MADEIRA_PREVIEW_IW_SKU= Dynamics 365 for Financials for IWs + PROJECT_ONLINE_PRO= Project Online Plan 3 + RIGHTSMANAGEMENT= Azure Rights Management Premium + RIGHTSMANAGEMENT_ADHOC= Windows Azure Rights Management + RIGHTSMANAGEMENT_STANDARD_FACULTY= Azure Rights Management for faculty + RIGHTSMANAGEMENT_STANDARD_STUDENT= Information Rights Management for Students + RMS_S_ENTERPRISE= Azure Active Directory Rights Management + RMS_S_ENTERPRISE_GOV= Windows Azure Active Directory Rights Management + RMS_S_PREMIUM= Azure Information Protection Plan 1 + RMS_S_PREMIUM2= Azure Information Protection Premium P2 + SCHOOL_DATA_SYNC_P1= School Data Sync (Plan 1) + SHAREPOINTDESKLESS= SharePoint Online Kiosk + SHAREPOINTDESKLESS_GOV= SharePoint Online Kiosk + SHAREPOINTENTERPRISE= SharePoint Online (Plan 2) + SHAREPOINTENTERPRISE_EDU= SharePoint Plan 2 for EDU + SHAREPOINTENTERPRISE_GOV= SharePoint Plan 2G + SHAREPOINTENTERPRISE_MIDMARKET= SharePoint Online (Plan 1) + SHAREPOINTLITE= SharePoint Online (Plan 1) + SHAREPOINTPARTNER= SharePoint Online Partner Access + SHAREPOINTSTANDARD= SharePoint Online Plan 1 + SHAREPOINTSTANDARD_EDU= SharePoint Plan 1 for EDU + SHAREPOINTSTORAGE= SharePoint Online Storage + SHAREPOINTWAC= Office Online + SHAREPOINTWAC_EDU= Office Online for Education + SHAREPOINTWAC_GOV= Office Online for Government + SHAREPOINT_PROJECT= SharePoint Online (Plan 2) Project + SHAREPOINT_PROJECT_EDU= Project Online Service for Education + SMB_APPS= Business Apps (free) + SMB_BUSINESS= Office 365 Business + SMB_BUSINESS_ESSENTIALS= Office 365 Business Essentials + SMB_BUSINESS_PREMIUM= Office 365 Business Premium + SPZA IW= Microsoft PowerApps Plan 2 Trial + SPB= Microsoft 365 Business + SPE_E3= Secure Productive Enterprise E3 + SQL_IS_SSIM= Power BI Information Services + STANDARDPACK= Office 365 (Plan E1) + STANDARDPACK_FACULTY= Office 365 (Plan A1) for Faculty + STANDARDPACK_GOV= Microsoft Office 365 (Plan G1) for Government + STANDARDPACK_STUDENT= Office 365 (Plan A1) for Students + STANDARDWOFFPACK= Office 365 (Plan E2) + STANDARDWOFFPACKPACK_FACULTY= Office 365 (Plan A2) for Faculty + STANDARDWOFFPACKPACK_STUDENT= Office 365 (Plan A2) for Students + STANDARDWOFFPACK_FACULTY= Office 365 Education E1 for Faculty + STANDARDWOFFPACK_GOV= Microsoft Office 365 (Plan G2) for Government + STANDARDWOFFPACK_IW_FACULTY= Office 365 Education for Faculty + STANDARDWOFFPACK_IW_STUDENT= Office 365 Education for Students + STANDARDWOFFPACK_STUDENT= Microsoft Office 365 (Plan A2) for Students + STANDARD_B_PILOT= Office 365 (Small Business Preview) + STREAM= Microsoft Stream + STREAM_O365_E3= Microsoft Stream for O365 E3 SKU + STREAM_O365_E5= Microsoft Stream for O365 E5 SKU + SWAY= Sway + TEAMS1= Microsoft Teams + TEAMS_COMMERCIAL_TRIAL= Microsoft Teams Commercial Cloud Trial + THREAT_INTELLIGENCE= Office 365 Threat Intelligence + VIDEO_INTEROP = Skype Meeting Video Interop for Skype for Business + VISIOCLIENT= Visio Online Plan 2 + VISIOONLINE_PLAN1= Visio Online Plan 1 + VISIO_CLIENT_SUBSCRIPTION= Visio Pro for Office 365 + WACONEDRIVEENTERPRISE= OneDrive for Business (Plan 2) + WACONEDRIVESTANDARD= OneDrive for Business with Office Online + WACSHAREPOINTSTD= Office Online STD + WHITEBOARD_PLAN3= White Board (Plan 3) + WIN_DEF_ATP= Windows Defender Advanced Threat Protection + WIN10_PRO_ENT_SUB= Windows 10 Enterprise E3 + WIN10_VDA_E3= Windows E3 + WIN10_VDA_E5= Windows E5 + WINDOWS_STORE= Windows Store + YAMMER_EDU= Yammer for Academic + YAMMER_ENTERPRISE= Yammer for the Starship Enterprise + YAMMER_ENTERPRISE_STANDALONE= Yammer Enterprise + YAMMER_MIDSIZE= Yammer \ No newline at end of file diff --git a/Office365 License Reporting And Management/O365LicenseReportingAndManagement.ps1 b/Office365 License Reporting And Management/O365LicenseReportingAndManagement.ps1 new file mode 100644 index 0000000..0b78465 --- /dev/null +++ b/Office365 License Reporting And Management/O365LicenseReportingAndManagement.ps1 @@ -0,0 +1,468 @@ + +Param +( + [Parameter(Mandatory = $false)] + [string]$LicenseName, + [string]$LicenseUsageLocation, + [int]$Action, + [switch]$MultipleActionsMode, + [string]$UserName, + [string]$Password +) + +Function Open_OutputFile +{ + #Open output file after execution + if((Test-Path -Path $OutputCSVName) -eq "True") + { + if($ActionFlag -eq "Report") + { + Write-Host Detailed license report is available in: $OutputCSVName -Foregroundcolor Green + Write-Host The report has $ProcessedCount records + } + elseif($ActionFlag -eq "Mgmt") + { + Write-Host License assignment/removal log file is available in: $OutputCSVName -ForegroundColor Green + } + Write-Host `nFor more Office 365 related PowerShell scripts, check https://o365reports.com -ForegroundColor Cyan + $Prompt = New-Object -ComObject wscript.shell + $UserInput = $Prompt.popup("Do you want to open output file?",` + 0,"Open Output File",4) + If ($UserInput -eq 6) + { + Invoke-Item "$OutputCSVName" + } + } + Else + { + Write-Host No records found + } + Write-Progress -Activity Export CSV -Completed +} + +#Get users' details +Function Get_UserInfo +{ + $global:DisplayName=$_.DisplayName + $global:UPN=$_.UserPrincipalName + $global:Licenses=$_.Licenses.AccountSkuId + $SigninStatus=$_.BlockCredential + if($SigninStatus -eq $False) + {$global:SigninStatus="Enabled"} + else{$global:SigninStatus="Disabled"} + $global:Department=$_.Department + $global:JobTitle=$_.Title + if($Department -eq $null) + {$global:Department="-"} + if($JobTitle -eq $null) + {$global:JobTitle="-"} +} + +Function Get_License_FriendlyName +{ + $FriendlyName=@() + $LicensePlan=@() + #Convert license plan to friendly name + foreach($License in $Licenses) + { + $LicenseItem= $License -Split ":" | Select-Object -Last 1 + $EasyName=$FriendlyNameHash[$LicenseItem] + if(!($EasyName)) + {$NamePrint=$LicenseItem} + else + {$NamePrint=$EasyName} + $FriendlyName=$FriendlyName+$NamePrint + $LicensePlan=$LicensePlan+$LicenseItem + } + $global:LicensePlans=$LicensePlan -join "," + $global:FriendlyNames=$FriendlyName -join "," +} + +Function Set_UsageLocation +{ + if($LicenseUsageLocation -ne "") + { + "Assigning Usage Location $LicenseUsageLocation to $UserName" | Out-File $OutputCSVName -Append + Set-MsolUser -UserPrincipalName $UserName -UsageLocation $LicenseUsageLocation + } + else + { + "Usage location is mandatory to assign license. Please set Usage location for $UserName" | Out-File $OutputCSVName -Append + } +} + +Function Assign_Licenses +{ + "Assigning $LicenseNames license to $UPN" | Out-File $OutputCSVName -Append + Set-MsolUserLicense -UserPrincipalName $UPN -AddLicenses $LicenseNames + if($?) + { + "License assigned successfully" | Out-File $OutputCSVName -Append + } + else + { + "License assignment failed" | Out-file $OutputCSVName -Append + } +} + +Function Remove_Licenses +{ + Write-Progress -Activity "`n Removing $License license from $UPN "`n" Processed users: $ProcessedCount" + "Removing $License license from $UPN" | Out-File $OutputCSVName -Append + Set-MsolUserLicense -UserPrincipalName $UPN -RemoveLicenses $License + if($?) + { + "License removed successfully" | Out-File $OutputCSVName -Append + } + else + { + "License removal failed" | Out-file $OutputCSVName -Append + } +} + +Function main() +{ + #Check for MSOnline module + $Modules=Get-Module -Name MSOnline -ListAvailable + if($Modules.count -eq 0) + { + Write-Host Please install MSOnline module using below command: `nInstall-Module MSOnline -ForegroundColor yellow + Exit + } + + #Storing credential in script for scheduling purpose/ Passing credential as parameter + if(($UserName -ne "") -and ($Password -ne "")) + { + $SecuredPassword = ConvertTo-SecureString -AsPlainText $Password -Force + $Credential = New-Object System.Management.Automation.PSCredential $UserName,$SecuredPassword + Connect-MsolService -Credential $credential + } + else + { + Connect-MsolService | Out-Null + } + $Result="" + $Results=@() + $FriendlyNameHash=Get-Content -Raw -Path .\LicenseFriendlyName.txt -ErrorAction Stop | ConvertFrom-StringData + [boolean]$Delay=$false + + + Do { + if($Action -eq "") + { + + + Write-Host "" + Write-host `nOffice 365 License Reporting -ForegroundColor Yellow + Write-Host " 1.Get all licensed users" -ForegroundColor Cyan + Write-Host " 2.Get all unlicensed users" -ForegroundColor Cyan + Write-Host " 3.Get users with specific license type" -ForegroundColor Cyan + Write-Host " 4.Get all disabled users with licenses" -ForegroundColor Cyan + Write-Host " 5.Office 365 license usage report" -ForegroundColor Cyan + Write-Host `nOffice 365 License Management -ForegroundColor Yellow + Write-Host " 6.Bulk:Assign a license to users (input CSV)" -ForegroundColor Cyan + Write-Host " 7.Bulk:Assign multiple licenses to users (input CSV)" -ForegroundColor Cyan + Write-Host " 8.Remove all license from a user" -ForegroundColor Cyan + Write-Host " 9.Bulk:Remove all licenses from users (input CSV)" -ForegroundColor Cyan + Write-Host " 10.Remove specific license from all users" -ForegroundColor Cyan + Write-Host " 11.Remove all license from disabled users" -ForegroundColor Cyan + Write-Host " 0.Exit" -ForegroundColor Cyan + Write-Host "" + $GetAction = Read-Host 'Please choose the action to continue' + } + else + { + $GetAction=$Action + } + + Switch ($GetAction) { + 1 { + $OutputCSVName=".\O365UserLicenseReport_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv" + Write-Host Generating licensed users report... + $ProcessedCount=0 + Get-MsolUser -All | where {$_.IsLicensed -eq $true} | foreach { + $ProcessedCount++ + Get_UserInfo + Write-Progress -Activity "`n Processed users count: $ProcessedCount "`n" Currently Processing: $DisplayName" + Get_License_FriendlyName + $Result = @{'Display Name'=$Displayname;'UPN'=$upn;'License Plan'=$LicensePlans;'License Plan Friendly Name'=$FriendlyNames;'Account Status'=$SigninStatus;'Department'=$Department;'Job Title'=$JobTitle } + $Results = New-Object PSObject -Property $Result + $Results |select-object 'Display Name','UPN','License Plan','License Plan Friendly Name','Account Status','Department','Job Title' | Export-Csv -Path $OutputCSVName -Notype -Append + } + $ActionFlag="Report" + Open_OutputFile + } + + 2 { + $OutputCSVName=".\O365UnlicenedUserReport_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv" + Write-Host Generating Unlicensed users report... + $ProcessedCount=0 + Get-MsolUser -All -UnlicensedUsersOnly | foreach { + $ProcessedCount++ + Get_UserInfo + Write-Progress -Activity "`n Processed users count: $ProcessedCount "`n" Currently Processing: $DisplayName" + $Result = @{'Display Name'=$Displayname;'UPN'=$UPN;'Department'=$Department;'Signin Status'=$SigninStatus;'Job Title'=$JobTitle } + $Results = New-Object PSObject -Property $Result + $Results |select-object 'Display Name','UPN','Department','Job Title','Signin Status' | Export-Csv -Path $OutputCSVName -Notype -Append + } + $ActionFlag="Report" + Open_OutputFile + } + + 3 { + $OutputCSVName="./O365UsersWithSpecificLicenseReport__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv" + if($LicenseName -eq "") + { + $LicenseName=Read-Host "Enter the license SKU(Eg:contoso:Enterprisepack)" + } + Write-Host Getting users with $LicenseName license... + $ProcessedCount=0 + if((Get-MsolAccountSku).AccountSkuID -icontains $LicenseName) + { + Get-MsolUser -All | Where-Object {($_.licenses).AccountSkuId -eq $LicenseName} | foreach{ + $ProcessedCount++ + Get_UserInfo + Write-Progress -Activity "`n Processed users count: $ProcessedCount "`n" Currently Processing: $DisplayName" + Get_License_FriendlyName + $Result = @{'Display Name'=$Displayname;'UPN'=$upn;'License Plan'=$LicensePlans;'License Plan_Friendly Name'=$FriendlyNames;'Account Status'=$SigninStatus;'Department'=$Department;'Job Title'=$JobTitle } + $Results = New-Object PSObject -Property $Result + $Results |select-object 'Display Name','UPN','License Plan','License Plan_Friendly Name','Account Status','Department','Job Title' | Export-Csv -Path $OutputCSVName -Notype -Append + } + } + else + { + Write-Host $LicenseName is not used in your organization. Please check the license name or run the License Usage Report to know the licenses in your org -ForegroundColor Red + } + #Clearing license name for next iteration + $LicenseName="" + $ActionFlag="Report" + Open_OutputFile + } + + 4 { + $OutputCSVName="./O365DiabledUsersWithLicense__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv" + $ProcessedCount=0 + Write-Host Finding disabled users still licensed in Office 365... + Get-MsolUser -All -EnabledFilter DisabledOnly | where {$_.IsLicensed -eq $true} | foreach { + $ProcessedCount++ + Get_UserInfo + Write-Progress -Activity "`n Processed users count: $ProcessedCount "`n" Currently Processing: $DisplayName" + $AssignedLicense="" + $FriendlyName="" + $Count=0 + Get_License_FriendlyName + $Result = @{'Display Name'=$Displayname;'UPN'=$upn;'License Plan'=$LicensePlans;'License Plan_Friendly Name'=$FriendlyNames;'Department'=$Department;'Job Title'=$JobTitle } + $Results = New-Object PSObject -Property $Result + $Results |select-object 'Display Name','UPN','License Plan','License Plan_Friendly Name','Department','Job Title' | Export-Csv -Path $OutputCSVName -Notype -Append + } + $ActionFlag="Report" + Open_OutputFile + } + + 5 { + $OutputCSVName="./Office365LicenseUsageReport__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv" + Write-Host Generating Office 365 license usage report... + $ProcessedCount=0 + Get-MsolAccountSku | foreach { + $ProcessedCount++ + $AccountSkuID=$_.AccountSkuID + $LicensePlan= $_.SkuPartNumber + $SubscriptionState=Get-MsolSubscription + Write-Progress -Activity "`n Retrieving license info "`n" Currently Processing: $LicensePlan" + $EasyName=$FriendlyNameHash[$LicensePlan] + if(!($EasyName)) + {$FriendlyName=$LicenseItem} + else + {$FriendlyName=$EasyName} + $Result = @{'AccountSkuId'=$AccountSkuID;'License Plan_Friendly Name'=$FriendlyName;'Active Units'=$_.ActiveUnits;'Consumed Units'=$_.ConsumedUnits } + $Results = New-Object PSObject -Property $Result + $Results |select-object 'AccountSkuId','License Plan_Friendly Name','Active Units','Consumed Units' | Export-Csv -Path $OutputCSVName -Notype -Append + } + $ActionFlag="Report" + Open_OutputFile + } + + 6 { + $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)" + + #We have an input file, read it into memory + $UserNames=@() + $UserNames=Import-Csv -Header "UPN" $UserNamesFile + $ProcessedCount=0 + $LicenseNames=Read-Host "Enter the license name(Eg:contoso:Enterprisepack)" + Write-Host Assigning license to users... + if((Get-MsolAccountSku).AccountSkuID -icontains $LicenseNames) + { + foreach($Item in $UserNames) + { + $ProcessedCount++ + $UPN=$Item.UPN + Write-Progress -Activity "`n Assigning $LicenseNames license to $UPN "`n" Processed users: $ProcessedCount" + $UsageLocation=(Get-MsolUser -UserPrincipalName $UPN).UsageLocation + if($UsageLocation -eq $null) + { + Set_UsageLocation + } + else + { + Assign_Licenses + } + } + } + else + { + Write-Host $LicenseNames is not used in your organization. Please check the license name or run the License Usage Report to know the licenses in your org -ForegroundColor Red + } + #Clearing license name and input file location for next iteration + $LicenseNames="" + $UserNamesFile="" + $ActionFlag="Mgmt" + Open_OutputFile + } + + 7 { + $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)" + + #We have an input file, read it into memory + $UserNames=@() + $UserNames=Import-Csv -Header "UPN" $UserNamesFile + $Flag="" + $ProcessedCount=0 + $LicenseNames=Read-Host "Enter the license names(Eg:TenantName:LicensePlan1,TenantName:LicensePlan2)" + $LicenseNames=$LicenseNames.Replace(' ','') + $LicenseNames=$LicenseNames.split(",") + foreach($LicenseName in $LicenseNames) + { + if((Get-MsolAccountSku).AccountSkuID -inotcontains $LicenseName) + { + $Flag="Terminate" + Write-Host $LicenseName is not used in your organization. Please check the license name or run the License Usage Report to know the licenses in your org -ForegroundColor Red + } + } + if($Flag -eq "Terminate") + { + Write-Host Please re-run the script with appropriate license name -ForegroundColor Yellow + } + else + { + Write-Host Assigning licenses to Office 365 users... + foreach($Item in $UserNames) + { + $UPN=$Item.UPN + $ProcessedCount++ + $UsageLocation=(Get-MsolUser -UserPrincipalName $UPN).UsageLocation + if($UsageLocation -eq $null) + { + Set_UsageLocation + } + else + { + Write-Progress -Activity "`n Assigning licenses to $UPN "`n" Processed users: $ProcessedCount" + Assign_Licenses + } + } + } + #Clearing license names and input file location for next iteration + $LicenseNames="" + $UserNamesFile="" + $ActionFlag="Mgmt" + Open_OutputFile + } + + + 8 { + $Identity=Read-Host Enter User UPN + $UserInfo=Get-MsolUser -UserPrincipalName $Identity + #Checking whether the user is available + if($UserInfo -eq $null) + { + Write-Host User $Identity does not exist. Please check the user name. -ForegroundColor Red + } + else + { + $Licenses=$UserInfo.Licenses.AccountSkuID + Write-Host Removing $Licenses license from $Identity + Set-MsolUserLicense -UserPrincipalName $Identity -RemoveLicenses $Licenses + Write-Host Action completed -ForegroundColor Green + } + } + + 9 { + $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)" + + #We have an input file, read it into memory + $UserNames=@() + $UserNames=Import-Csv -Header "UPN" $UserNamesFile + $ProcessedCount=0 + foreach($Item in $UserNames) + { + $UPN=$Item.UPN + $ProcessedCount++ + # Write-Progress -Activity "`n Removing license from $UPN "`n" Processed users: $ProcessedCount" + $License=(Get-MsolUser -UserPrincipalName $UPN).licenses.AccountSkuID + Remove_Licenses + } + $ActionFlag="Mgmt" + Open_OutputFile + } + + 10 { + $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)" + $ProcessedCount=0 + Write-Host Removing $License license from users... + if((Get-MsolAccountSku).AccountSkuID -icontains $License) + { + Get-MsolUser -All | Where-Object {($_.licenses).AccountSkuId -eq $License} | foreach{ + $ProcessedCount++ + $UPN=$_.UserPrincipalName + Remove_Licenses + } + } + else + { + Write-Host $License not used in your organization. Please check the license name or run the License Usage Report to know the licenses in your org -ForegroundColor Red + } + $ActionFlag="Mgmt" + Open_OutputFile + } + + 11 { + $OutputCSVName="./O365LicenseRemoval_Log__$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).txt" + Write-Host Removing license from disabled users... + $ProcessedCount=0 + Get-MsolUser -All -EnabledFilter DisabledOnly | where {$_.IsLicensed -eq $true} | foreach { + $ProcessedCount++ + $UPN=$_.UserPrincipalName + $License=$_.Licenses.AccountSkuID + Remove_Licenses + } + $ActionFlag="Mgmt" + Open_OutputFile + } + } + if($Action -ne "") + {exit} + if($MultipleActionsMode.ispresent) + { + Start-Sleep -Seconds 2 + } + else + { + Exit + } + } + While ($GetAction -ne 0) + Clear-Host +} +. 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 +============================================================================================ +#> \ No newline at end of file