Gestire le licenze utente usando Microsoft Entra PowerShell

Questo articolo illustra come usare Microsoft Entra PowerShell per gestire le licenze utente nell'organizzazione. Si apprenderà come esaminare e controllare le assegnazioni di licenze, assegnare licenze a utenti singoli e multipli, rimuovere licenze e gestire licenze utente inattive.

Microsoft Entra servizi richiedono licenze per l'accesso. Con PowerShell è possibile gestire in modo efficiente queste licenze nel tenant per ottimizzare i costi e garantire l'accesso appropriato per gli utenti.

Prerequisiti

  1. Installare il modulo Microsoft Entra PowerShell. Seguire la guida all'installazione.

  2. Accedere come utente con il ruolo Amministratore licenze . Hai bisogno delle autorizzazioni User.ReadWrite.All e Organization.Read.All. Eseguire questo comando per impostarli:

    Connect-Entra -Scopes 'User.ReadWrite.All','Organization.Read.All','LicenseAssignment.Read.All'
    
  3. Assicurarsi che agli utenti sia assegnata una posizione. Per trovare gli utenti senza un UsageLocation, esegui:

    Connect-Entra -Scopes 'User.ReadWrite.All'
    $users = Get-EntraUser -All | Where-Object { $_.UsageLocation -eq $null -and $_.UserType -eq 'Member' }
    $users | Select-Object Id, DisplayName, UserPrincipalName, UsageLocation
    

    Per impostare la posizione di un utente, eseguire:

    Set-EntraUser -UserId 'GjeEdla@Contoso.com' -UsageLocation 'US'
    

Esaminare i piani di licenza e l'utilizzo di Microsoft Entra disponibili

Per visualizzare i piani di licenza disponibili, eseguire il Get-EntraSubscribedSku cmdlet . Sono necessarie le autorizzazioni Organization.Read.All e LicenseAssignment.Read.All.

Per controllare i piani di licenza correnti, le licenze disponibili e lo stato di consumo, eseguire:

Connect-Entra -Scopes 'User.ReadWrite.All','Organization.Read.All','LicenseAssignment.Read.All'
Get-EntraSubscribedSku | Select-Object -Property Sku*, ConsumedUnits -ExpandProperty PrepaidUnits
Enabled              : 5
LockedOut            : 0
Suspended            : 0
Warning              : 0
AdditionalProperties :
SkuId                : efccb6f7-5641-4e0e-bd10-b4976e1bf68e
SkuPartNumber        : EMS
ConsumedUnits        : 3

L'output mostra informazioni importanti sulle licenze:

  • SkuPartNumber: nome del piano di licenza (ad esempio, "EMS" per Enterprise Mobility + Security)
  • Enabled: numero totale di licenze acquistate disponibili per questo piano
  • ConsumedUnits: numero di licenze attualmente assegnate agli utenti
  • LockedOut, Suspended, Warning: Indicatori di stato per il monitoraggio dello stato delle licenze

Trovare e controllare gli utenti con licenze specifiche

Per trovare tutti gli utenti a cui è assegnata una licenza specifica, usare questo processo in due passaggi:

  1. Ottenere l'ID SKU per il piano di licenza di destinazione
  2. Filtrare l'elenco utenti per trovare quelli con licenze corrispondenti
Connect-Entra -Scopes 'Organization.Read.All','LicenseAssignment.Read.All'

# Get the SKU ID for EMSPREMIUM license plan
$skuId = (Get-EntraSubscribedSku | Where-Object { $_.SkuPartNumber -eq 'EMSPREMIUM' }).SkuId

# Find users who have this license
$usersWithLicense = Get-EntraUser -All | Where-Object {
    $_.AssignedLicenses -and 
    ($_.AssignedLicenses.SkuId -contains $skuId)
}

# Display the results
$usersWithLicense | Select-Object DisplayName, UserPrincipalName, AccountEnabled |
    Format-Table -AutoSize

Assegnare licenze agli utenti

Prima di assegnare le licenze, verificare quali licenze sono già assegnate all'utente.

Visualizzare le licenze assegnate a un utente

Per visualizzare le licenze assegnate a un utente, eseguire il comando seguente:

Connect-Entra -Scopes 'User.Read.All'
$userLicenses = Get-EntraUserLicenseDetail -UserId 'GjeEdla@Contoso.com'
$userLicenses
Id                                          SkuId                                SkuPartNumber
--                                          -----                                -------------
IR173R7-BkGrv95BU2ETAjchYPkDIntEn_9Bs24Izl0 f9602137-2203-447b-9fff-41b36e08ce5d Microsoft_Entra_Suite
IR173R7-BkGrv95BU2ETAk8SXrDMx6BFpqqM94yUaWg b05e124f-c7cc-45a0-a6aa-8cf78c946968 EMSPREMIUM

Per visualizzare tutti i piani di servizio attivi nella licenza assegnata all'utente, eseguire il comando seguente:

$userLicenses.ServicePlans | Where-Object { $_.ProvisioningStatus -eq 'Success' } | Select-Object ServicePlanName, ProvisioningStatus
ServicePlanName                        ProvisioningStatus
---------------                        ------------------
Verifiable_Credentials_Service_Request Success
AAD_PREMIUM_P2                         Success
Entra_Premium_Private_Access           Success
Entra_Premium_Internet_Access          Success
Entra_Identity_Governance              Success
M365_AUDIT_PLATFORM                    Success

Assegnare una licenza a un utente

Per assegnare una licenza a un utente, usare il Set-EntraUserLicense cmdlet , che aggiunge o rimuove le licenze dall'assegnazione di un utente.

# Connect to Entra
Connect-Entra -Scopes 'User.ReadWrite.All'

# Get user details
$user = Get-EntraUser -UserId 'AljosaH@Contoso.com'

# Define the license plan to assign to the user
$license = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$license.SkuId = (Get-EntraSubscribedSku | Where-Object { $_.SkuPartNumber -eq 'AAD_PREMIUM_P2' }).SkuId

$licenses = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$licenses.AddLicenses = $license

# Assign the license to the user
Set-EntraUserLicense -UserId $user.Id -AssignedLicenses $licenses

Per verificare che la licenza sia assegnata all'utente, eseguire:

Get-EntraUserLicenseDetail -UserId 'AljosaH@Contoso.com'

Assegnare più licenze a un utente

Per assegnare più licenze a un utente, creare una matrice di AssignedLicense oggetti e aggiungerle all'oggetto AssignedLicenses . Questo script assegna i piani di licenza AAD_PREMIUM_P2 e EMS a un utente.

# Connect to Entra
Connect-Entra -Scopes 'Organization.ReadWrite.All'

# Retrieve the SkuId for the desired license plans
$skuId1 = (Get-EntraSubscribedSku | Where-Object { $_.SkuPartNumber -eq 'AAD_PREMIUM_P2' }).SkuId
$skuId2 = (Get-EntraSubscribedSku | Where-Object { $_.SkuPartNumber -eq 'EMS' }).SkuId

# Get the user to assign the licenses to
$user = Get-EntraUser -UserId 'AljosaH@Contoso.com'

# Create license assignment objects
$license1 = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$license1.SkuId = $skuId1

$license2 = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$license2.SkuId = $skuId2

$licenses = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$licenses.AddLicenses = $license1, $license2

# Assign the licenses to the user
Set-EntraUserLicense -UserId $user.Id -AssignedLicenses $licenses

Assegnare una licenza a un utente copiando la licenza da un altro utente

Si vogliono assegnare le stesse licenze da un utente a un altro. È prima necessario recuperare i dettagli della licenza dall'utente esistente, quindi assegnare tali licenze al nuovo utente.

In questo esempio, si scorrono tutte le licenze assegnate all'utente esistente e le si assegna all'utente di destinazione.

# Connect to Entra
Connect-Entra -Scopes 'User.ReadWrite.All'

# Define the source and target users
$licensedUser = Get-EntraUser -UserId 'AljosaH@Contoso.com'
$targetUser = Get-EntraUser -UserId 'PalameeC@Contoso.com' 

# Retrieve the source user and their licenses
$sourceUserLicenses = $licensedUser.AssignedLicenses

# Create license assignment objects for each license and assign them to the target user
$licensesToAssign = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses 
foreach ($license in $sourceUserLicenses) {
    $assignedLicense = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
    $assignedLicense.SkuId = $license.SkuId
    $licensesToAssign.AddLicenses = $assignedLicense
    Set-EntraUserLicense -UserId $targetUser.Id -AssignedLicenses $licensesToAssign
}

Assegnare in blocco più licenze per più utenti contemporaneamente

Questo script assegna più licenze a più utenti contemporaneamente. È possibile definire l'elenco degli utenti direttamente nello script o importarli da un file CSV.

# Connect to Entra
Connect-Entra -Scopes 'Organization.ReadWrite.All'

# Retrieve the SkuId for the desired license plans
$skuId1 = (Get-EntraSubscribedSku | Where-Object { $_.SkuPartNumber -eq 'AAD_PREMIUM_P2' }).SkuId
$skuId2 = (Get-EntraSubscribedSku | Where-Object { $_.SkuPartNumber -eq 'EMS' }).SkuId

# Option 1: Define users directly
$users = ('AljosaH@Contoso.com','PalameeC@Contoso.com')

# Option 2: Import users from a CSV file (the CSV should have a column named 'user')
# $users = Import-Csv -Path "C:\path\to\your\users.csv" | Select-Object -ExpandProperty user

# Create license assignment objects
$license1 = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$license1.SkuId = $skuId1

$license2 = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$license2.SkuId = $skuId2

$licenses = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$licenses.AddLicenses = $license1, $license2

# Assign the licenses to each user
foreach ($user in $users) {
 Set-EntraUserLicense -UserId $user -AssignedLicenses $licenses
}

Elencare gli utenti inattivi con licenze attive

Il controllo delle licenze per gli utenti inattivi consente di ridurre i costi e migliorare la sicurezza. Per elencare gli utenti inattivi con licenze attive, eseguire questo comando:

Connect-Entra -Scopes 'User.Read.All'
$disabledUsersWithLicenses = Get-EntraUser -Filter "accountEnabled eq false" -All | Where-Object {
    $_.AssignedLicenses -ne $null -and $_.AssignedLicenses.Count -gt 0
}
$disabledUsersWithLicenses | Select-Object Id, DisplayName, UserPrincipalName, AccountEnabled | Format-Table -AutoSize

Rimuovere le licenze assegnate a un utente

Per rimuovere una licenza assegnata a un utente, seguire questa procedura:

Connect-Entra -Scopes 'User.ReadWrite.All'
# Get user details
$user = Get-EntraUser -UserId 'AljosaH@Contoso.com'

# Get the license assigned to the user
$skuId = (Get-EntraUserLicenseDetail -UserId $user.Id).SkuId

# Define the license object
$licensesToRemove = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$licensesToRemove.RemoveLicenses = $skuId

# Remove the assigned license
Set-EntraUserLicense -UserId $user.Id -AssignedLicenses $licensesToRemove