Assegnare licenze di Microsoft 365 agli account utente con PowerShell

Questo articolo si applica sia a Microsoft 365 Enterprise che a Office 365 Enterprise.

Gli utenti non possono usare alcun servizio Microsoft 365 fino a quando al proprio account non viene assegnata una licenza da un piano di licenza. È possibile usare PowerShell per assegnare rapidamente le licenze agli account senza licenza.

Agli account utente deve prima essere assegnata una posizione. La specifica di una posizione è una parte obbligatoria della creazione di un nuovo account utente nel interfaccia di amministrazione di Microsoft 365.

Per impostazione predefinita, per gli account sincronizzati dal Active Directory locale Domain Services non è specificata una posizione. È possibile configurare un percorso per questi account da:

  • L'interfaccia di amministrazione di Microsoft 365
  • PowerShell
  • Il portale di Azure (Account utente >utenti>di Active Directory>Informazioni> dicontatto>Paese o area geografica).

Nota

Informazioni su come assegnare licenze agli account utente con il interfaccia di amministrazione di Microsoft 365. Per un elenco di risorse aggiuntive, vedere Gestire utenti e gruppi.

Usare Microsoft Graph PowerShell SDK

Prima di tutto, connettersi al tenant di Microsoft 365.

Per assegnare e rimuovere licenze per un utente è necessario l'ambito di autorizzazione User.ReadWrite.All o una delle altre autorizzazioni elencate nella pagina di riferimento "Assegna licenza" di Microsoft API Graph.

L'ambito di autorizzazione Organization.Read.All è necessario per leggere le licenze disponibili nel tenant.

Connect-MgGraph -Scopes User.ReadWrite.All, Organization.Read.All

Eseguire il Get-MgSubscribedSku comando per visualizzare i piani di licenza disponibili e il numero di licenze disponibili in ogni piano dell'organizzazione. Il numero di licenze disponibili in ogni piano è ActiveUnits - WarningUnits - ConsumedUnits. Per altre informazioni su piani di licenza, licenze e servizi, vedere Visualizzare licenze e servizi con PowerShell.

Per trovare gli account senza licenza nell'organizzazione, eseguire questo comando.

Get-MgUser -Filter 'assignedLicenses/$count eq 0' -ConsistencyLevel eventual -CountVariable unlicensedUserCount -All

Per trovare gli utenti sincronizzati senza licenza nell'organizzazione, eseguire questo comando.

Get-MgUser -Filter 'assignedLicenses/$count eq 0 and OnPremisesSyncEnabled eq true' -ConsistencyLevel eventual -CountVariable unlicensedUserCount -All -Select UserPrincipalName

È possibile assegnare licenze solo agli account utente con la proprietà UsageLocation impostata su un codice paese ISO 3166-1 alfa-2 valido. Ad esempio, US per gli Stati Uniti e FR per la Francia. Alcuni servizi di Microsoft 365 non sono disponibili in alcuni paesi o aree geografiche. Per altre informazioni, vedere Informazioni sulle restrizioni di licenza.

Per trovare gli account che non hanno un valore UsageLocation , eseguire questo comando.

Get-MgUser -Select Id,DisplayName,Mail,UserPrincipalName,UsageLocation,UserType | where { $_.UsageLocation -eq $null -and $_.UserType -eq 'Member' }

Per impostare il valore UsageLocation in un account, eseguire questo comando.

$userUPN="<user sign-in name (UPN)>"
$userLoc="<ISO 3166-1 alpha-2 country code>"

Update-MgUser -UserId $userUPN -UsageLocation $userLoc

Ad esempio:

Update-MgUser -UserId "belindan@litwareinc.com" -UsageLocation US

Se si usa il cmdlet Get-MgUser senza usare il parametro -All , vengono restituiti solo i primi 100 account.

Assegnazione di licenze agli account utente

Per assegnare una licenza a un utente, usare il comando seguente in PowerShell.

Set-MgUserLicense -UserId $userUPN -AddLicenses @{SkuId = "<SkuId>"} -RemoveLicenses @()

In questo esempio viene assegnata una licenza dal piano di licenza SPE_E5 (Microsoft 365 E5) all'utente belindan@litwareinc.comsenza licenza:

$e5Sku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'SPE_E5'
Set-MgUserLicense -UserId "belindan@litwareinc.com" -AddLicenses @{SkuId = $e5Sku.SkuId} -RemoveLicenses @()

Questo esempio assegna SPE_E5 (Microsoft 365 E5) ed EMSPREMIUM (ENTERPRISE MOBILITY + SECURITY E5) all'utente belindan@litwareinc.com:

$e5Sku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'SPE_E5'
$e5EmsSku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'EMSPREMIUM'
$addLicenses = @(
    @{SkuId = $e5Sku.SkuId},
    @{SkuId = $e5EmsSku.SkuId}
)

Set-MgUserLicense -UserId "belinda@litwareinc.com" -AddLicenses $addLicenses -RemoveLicenses @()

Questo esempio assegna SPE_E5 (Microsoft 365 E5) con i servizi MICROSOFTBOOKINGS (Microsoft Bookings) e LOCKBOX_ENTERPRISE (Customer Lockbox) disattivati:

$e5Sku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'SPE_E5'
$disabledPlans = $e5Sku.ServicePlans | `
    Where ServicePlanName -in ("LOCKBOX_ENTERPRISE", "MICROSOFTBOOKINGS") | `
    Select -ExpandProperty ServicePlanId

$addLicenses = @(
    @{
        SkuId = $e5Sku.SkuId
        DisabledPlans = $disabledPlans
    }
)

Set-MgUserLicense -UserId "belinda@litwareinc.com" -AddLicenses $addLicenses -RemoveLicenses @()

Questo esempio aggiorna un utente con SPE_E5 (Microsoft 365 E5) e disattiva i piani di servizio Sway e Forms lasciando nello stato corrente i piani disabilitati esistenti dell'utente:

$userLicense = Get-MgUserLicenseDetail -UserId "belinda@litwareinc.com"
$userDisabledPlans = $userLicense.ServicePlans | `
    Where ProvisioningStatus -eq "Disabled" | `
    Select -ExpandProperty ServicePlanId

$e5Sku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'SPE_E5'
$newDisabledPlans = $e5Sku.ServicePlans | `
    Where ServicePlanName -in ("SWAY", "FORMS_PLAN_E5") | `
    Select -ExpandProperty ServicePlanId

$disabledPlans = ($userDisabledPlans + $newDisabledPlans) | Select -Unique

$addLicenses = @(
    @{
        SkuId = $e5Sku.SkuId
        DisabledPlans = $disabledPlans
    }
)

Set-MgUserLicense -UserId "belinda@litwareinc.com" -AddLicenses $addLicenses -RemoveLicenses @()

Questo esempio aggiorna un utente con SPE_E5 (Microsoft 365 E5) e disattiva i piani di servizio Sway e Forms lasciando i piani disabilitati esistenti dell'utente in tutte le altre sottoscrizioni nello stato corrente:

$userLicense = Get-MgUserLicenseDetail -UserId belinda@litwareinc.com

$userDisabledPlans = $userLicense.ServicePlans | Where-Object ProvisioningStatus -eq "Disabled" | Select -ExpandProperty ServicePlanId

$e5Sku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'SPE_E5'

$newDisabledPlans = $e5Sku.ServicePlans | Where ServicePlanName -in ("SWAY", "FORMS_PLAN_E5") | Select -ExpandProperty ServicePlanId

$disabledPlans = ($userDisabledPlans + $newDisabledPlans) | Select -Unique

$result=@()
$allPlans = $e5Sku.ServicePlans | Select -ExpandProperty ServicePlanId

foreach($disabledPlan in $disabledPlans)
{
    foreach($allPlan in $allPlans)
    {
        if($disabledPlan -eq $allPlan)
        {
            $property = @{
                Disabled = $disabledPlan
            }
        }
     }
     $result += New-Object psobject -Property $property
}


$finalDisabled = $result | Select-Object -ExpandProperty Disabled


$addLicenses = @(
    @{
        SkuId = $e5Sku.SkuId
        DisabledPlans = $finalDisabled
    }
)


Set-MgUserLicense -UserId belinda@litwareinc.com -AddLicenses $addLicenses -RemoveLicenses @()

Assegnare licenze a un utente copiando l'assegnazione di licenza da un altro utente

Questo esempio assegna jamesp@litwareinc.com con lo stesso piano di licenza applicato a belindan@litwareinc.com:

$mgUser = Get-MgUser -UserId "belindan@litwareinc.com" -Property AssignedLicenses
Set-MgUserLicense -UserId "jamesp@litwareinc.com" -AddLicenses $mgUser.AssignedLicenses -RemoveLicenses @()

Spostare un utente in una sottoscrizione diversa (piano di licenza)

Questo esempio aggiorna un utente dal piano di licenza SPE_E3 (Microsoft 365 E3) al piano di licenza SPE_E5 (Microsoft 365 E5):

$e3Sku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'SPE_E3'
$e5Sku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'SPE_E5'

# Unassign E3
Set-MgUserLicense -UserId "belindan@litwareinc.com" -AddLicenses @{} -RemoveLicenses @($e3Sku.SkuId)
# Assign E5
Set-MgUserLicense -UserId "belindan@litwareinc.com" -AddLicenses @{SkuId = $e5Sku.SkuId} -RemoveLicenses @()

È possibile verificare la modifica nella sottoscrizione per l'account utente con questo comando.

Get-MgUserLicenseDetail -UserId "belindan@litwareinc.com"

Usare il modulo di Azure Active Directory PowerShell per Graph

Nota

Il cmdlet Set-AzureADUserLicense è pianificato per il ritiro. Eseguire la migrazione degli script al cmdlet Set-MgUserLicense di Microsoft Graph SDK, come descritto in precedenza. Per altre informazioni, vedere Eseguire la migrazione delle app per accedere alle API di gestione delle licenze da Microsoft Graph.

Prima di tutto, connettersi al tenant di Microsoft 365.

Elencare quindi i piani di licenza per il tenant con questo comando.

Get-AzureADSubscribedSku | Select SkuPartNumber

Ottenere quindi il nome di accesso dell'account a cui si vuole aggiungere una licenza, noto anche come nome dell'entità utente (UPN).

Assicurarsi quindi che all'account utente sia assegnata una posizione di utilizzo.

Get-AzureADUser -ObjectID <user sign-in name (UPN)> | Select DisplayName, UsageLocation

Se non è assegnato alcun percorso di utilizzo, è possibile assegnarne uno con questi comandi:

$userUPN="<user sign-in name (UPN)>"
$userLoc="<ISO 3166-1 alpha-2 country code>"
Set-AzureADUser -ObjectID $userUPN -UsageLocation $userLoc

Specificare infine il nome dell'accesso utente e il nome del piano di licenza ed eseguire questi comandi.

$userUPN="<user sign-in name (UPN)>"
$planName="<license plan name from the list of license plans>"
$License = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$License.SkuId = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $planName -EQ).SkuID
$LicensesToAssign = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$LicensesToAssign.AddLicenses = $License
Set-AzureADUserLicense -ObjectId $userUPN -AssignedLicenses $LicensesToAssign

Usare il modulo Microsoft Azure Active Directory per Windows PowerShell

Nota

I cmdlet Set-MsolUserLicense e New-MsolUser (-LicenseAssignment) sono pianificati per essere ritirati. Eseguire la migrazione degli script al cmdlet Set-MgUserLicense di Microsoft Graph SDK, come descritto in precedenza. Per altre informazioni, vedere Eseguire la migrazione delle app per accedere alle API di gestione delle licenze da Microsoft Graph.

Prima di tutto, connettersi al tenant di Microsoft 365.

Eseguire il Get-MsolAccountSku comando per visualizzare i piani di licenza disponibili e il numero di licenze disponibili in ogni piano dell'organizzazione. Il numero di licenze disponibili in ogni piano è ActiveUnits - WarningUnits - ConsumedUnits. Per altre informazioni su piani di licenza, licenze e servizi, vedere Visualizzare licenze e servizi con PowerShell.

Nota

PowerShell Core non supporta il modulo Microsoft Azure Active Directory per Windows PowerShell modulo e i cmdlet con Msol nel nome. Per continuare a usare i cmdlet, è necessario eseguirli in Windows PowerShell.

Per trovare gli account senza licenza nell'organizzazione, eseguire questo comando.

Get-MsolUser -All -UnlicensedUsersOnly

È possibile assegnare licenze solo agli account utente con la proprietà UsageLocation impostata su un codice paese ISO 3166-1 alfa-2 valido. Ad esempio, US per gli Stati Uniti e FR per la Francia. Alcuni servizi di Microsoft 365 non sono disponibili in alcuni paesi. Per altre informazioni, vedere Informazioni sulle restrizioni di licenza.

Per trovare gli account che non hanno un valore UsageLocation , eseguire questo comando.

Get-MsolUser -All | where {$_.UsageLocation -eq $null}

Per impostare il valore UsageLocation in un account, eseguire questo comando.

Set-MsolUser -UserPrincipalName "<Account>" -UsageLocation <CountryCode>

Ad esempio:

Set-MsolUser -UserPrincipalName "belindan@litwareinc.com" -UsageLocation US

Se si usa il cmdlet Get-MsolUser senza utilizzare il parametro -All, vengono restituiti solo i primi 500 account.

Assegnazione di licenze agli account utente

Per assegnare una licenza a un utente, usare il comando seguente in PowerShell.

Set-MsolUserLicense -UserPrincipalName "<Account>" -AddLicenses "<AccountSkuId>"

Questo esempio assegna una licenza dal piano di licenza litwareinc:ENTERPRISEPACK (Office 365 Enterprise E3) all'utente belindan@litwareinc.comsenza licenza:

Set-MsolUserLicense -UserPrincipalName "belindan@litwareinc.com" -AddLicenses "litwareinc:ENTERPRISEPACK"

Per assegnare una licenza a tutti gli utenti senza licenza, eseguire questo comando.

Get-MsolUser -All -UnlicensedUsersOnly [<FilterableAttributes>] | Set-MsolUserLicense -AddLicenses "<AccountSkuId>"

Nota

Non è possibile assegnare più licenze a un utente dallo stesso piano di gestione delle licenze. Se non si dispone di una quantità sufficiente di licenze disponibili, le licenze vengono assegnate agli utenti nell'ordine in cui vengono restituiti dal cmdlet Get-MsolUser finché non vengono esaurite le licenze disponibili.

Questo esempio assegna licenze dal piano di licenza litwareinc:ENTERPRISEPACK (Office 365 Enterprise E3) a tutti gli utenti senza licenza:

Get-MsolUser -All -UnlicensedUsersOnly | Set-MsolUserLicense -AddLicenses "litwareinc:ENTERPRISEPACK"

Questo esempio assegna le stesse licenze agli utenti senza licenza nel reparto Vendite nel Stati Uniti:

Get-MsolUser -All -Department "Sales" -UsageLocation "US" -UnlicensedUsersOnly | Set-MsolUserLicense -AddLicenses "litwareinc:ENTERPRISEPACK"

Spostare un utente in una sottoscrizione diversa (piano di licenza) con il modulo Azure Active Directory PowerShell per Graph

Prima di tutto, connettersi al tenant di Microsoft 365.

Ottenere quindi il nome di accesso dell'account utente per il quale si desidera cambiare sottoscrizioni, noto anche come nome dell'entità utente (UPN).

Elencare quindi le sottoscrizioni (piani di licenza) per il tenant con questo comando.

Get-AzureADSubscribedSku | Select SkuPartNumber

Elencare quindi le sottoscrizioni attualmente disponibili nell'account utente con questi comandi.

$userUPN="<user account UPN>"
$licensePlanList = Get-AzureADSubscribedSku
$userList = Get-AzureADUser -ObjectID $userUPN | Select -ExpandProperty AssignedLicenses | Select SkuID 
$userList | ForEach { $sku=$_.SkuId ; $licensePlanList | ForEach { If ( $sku -eq $_.ObjectId.substring($_.ObjectId.length - 36, 36) ) { Write-Host $_.SkuPartNumber } } }

Identificare la sottoscrizione attualmente disponibile per l'utente (la sottoscrizione FROM) e la sottoscrizione in cui l'utente si sta spostando (la sottoscrizione TO).

Infine, specificare i nomi di sottoscrizione TO e FROM (numeri di parte SKU) ed eseguire questi comandi.

$subscriptionFrom="<SKU part number of the current subscription>"
$subscriptionTo="<SKU part number of the new subscription>"
# Unassign
$license = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense
$licenses = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$licenses.RemoveLicenses =  (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $subscriptionFrom -EQ).SkuID
Set-AzureADUserLicense -ObjectId $userUPN -AssignedLicenses $licenses
# Assign
$license.SkuId = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $subscriptionTo -EQ).SkuID
$licenses = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses
$licenses.AddLicenses = $License
Set-AzureADUserLicense -ObjectId $userUPN -AssignedLicenses $licenses

È possibile verificare la modifica nella sottoscrizione per l'account utente con questi comandi.

$licensePlanList = Get-AzureADSubscribedSku
$userList = Get-AzureADUser -ObjectID $userUPN | Select -ExpandProperty AssignedLicenses | Select SkuID 
$userList | ForEach { $sku=$_.SkuId ; $licensePlanList | ForEach { If ( $sku -eq $_.ObjectId.substring($_.ObjectId.length - 36, 36) ) { Write-Host $_.SkuPartNumber } } }

Vedere anche

Gestire gli account utente, le licenze e i gruppi con PowerShell

Gestire Microsoft 365 con PowerShell

Guida introduttiva a PowerShell per Microsoft 365

Usare l'utente di Microsoft Graph: assignLicense e le API subscribedSku