Búsqueda de sitios web

Cómo asignar licencias de usuario con Microsoft Graph PowerShell


Asignar licencias de Microsoft 365 puede ser una tarea tediosa, incluso con las herramientas de acción masiva en el centro de administración de Microsoft 365, cuando se trata de cientos de usuarios, no es conveniente.

Completar estas tareas simples pero tediosas siempre es mejor usando PowerShell y definitivamente lo recomiendo cuando se trata de cientos de usuarios, ¡especialmente cuando los scripts que necesita ya están disponibles para usted!

En este tutorial, veremos cómo podemos usar Microsoft Graph PowerShell para asignar y eliminar licencias de usuarios en Microsoft 365.

Requisitos previos

Para este tutorial, debe tener instalado el módulo Microsoft Graph PowerShell. Si aún no lo tiene instalado, consulte mi guía sobre Cómo instalar el módulo Microsoft Graph PowerShell.

También es necesario que tengas suficientes licencias disponibles para asignar a tus usuarios. He creado un script manual aquí que exportará una lista de sus licencias disponibles y usadas usando Microsoft Graph PowerShell.

Usando Set-MgUserLicense

El cmdlet Set-MgUserLicense se puede encontrar en el módulo Microsoft.Graph.Users.Actions, mientras que el nivel mínimo de permisos para usar el comando es Users.ReadWrite .All, también puede utilizar el alcance del permiso Directory.ReadWrite.All.

Esta información se puede encontrar usando Find-MgGraphCommand, también podemos limitar los resultados seleccionando mostrar la información de 'Módulo' y 'Permisos'.

Find-MgGraphCommand -Command Set-MgUserLicense | Select Module, Permissions

El resultado del comando anterior se verá como el siguiente. (Verá 2 resultados, ya que muestra información para el perfil estándar (v1.0) y el perfil beta.

Encuentra usuarios sin licencia con filtros

Para comenzar, es posible que desee realizar una revisión de las cuentas de usuarios sin licencia en su inquilino. Para buscar usuarios sin licencia, puede aplicar un filtro en la propiedad de licencias asignadas mientras usa el cmdlet Get-MgUser.

Por ejemplo, para buscar todos los usuarios cuyo recuento de licencias sea igual a 0, utilice el siguiente comando:

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

Tenga en cuenta que esto encontrará todas las cuentas de usuario sin licencia y, si tiene grupos dinámicos que asignan automáticamente licencias gratuitas en su inquilino, esto no aparecerá en su resultado.

Asignar una licencia de usuario con Set-MgUserLicense

Primero, necesitamos importar los módulos necesarios a nuestra sesión de PowerShell y conectarnos a Microsoft Graph con los permisos necesarios.

Import-Module Microsoft.Graph.Users, Microsoft.Graph.Users.Actions
Connect-MgGraph -Scope User.ReadWrite.All

Ahora ya estamos conectados, necesitamos el ID del SKU de licencia que queremos asignar. Podemos solucionar esto ejecutando el cmdlet Get-MgSubscribedSku.

Get-MgSubscribedSku | Select SkuPartNumber, SkuId

En el resultado, verá una lista de todas las licencias disponibles, así como el SkuId que necesitaremos cuando usemos el cmdlet Set-MgUserLicense.

Desde aquí, podemos almacenar nuestra licencia de destino en una variable, a continuación almacenamos la información de nuestra licencia de Desarrollador E5 en la variable $license.

$license = Get-MgSubscribedSku | `
Where-Object {$_.SkuPartNumber -eq "DEVELOPERPACK_E5"}

Otra cosa que también necesitamos saber es la identificación del objeto de nuestro usuario objetivo. Para ello, utilizamos una táctica similar para almacenar nuestra información de usuario en una variable. A continuación, almacenamos la información de usuario de 'Adele Vance' en la variable $user.

$user = Get-MgUser | Where-Object {$_.DisplayName -eq "Adele Vance"}

Ahora podemos usar nuestras variables con el cmdlet Set-MgUserLicense con los parámetros -UserId y -AddLicense.

Set-MgUserLicense -UserId $user.Id `
-AddLicenses @{SkuId = ($license.SkuId)} -RemoveLicenses @()

Puede notar que también he definido el parámetro -RemoveLicenses con un valor vacío. Sin definir el parámetro -RemoveLicenses obtendrá el siguiente error:

Set-MgUserLicense: faltan uno o más parámetros de la operación 'assignLicense' en la carga útil de la solicitud. Los parámetros que faltan son: removeLicenses.

¡A continuación se muestra el script completo para que puedas copiarlo y pegarlo!

Asignar varias licencias al mismo tiempo

Import-Module Microsoft.Graph.Users
Connect-MgGraph -scope User.ReadWrite.All
$license = Get-MgSubscribedSku | Where-Object {$_.SkuPartNumber -eq "DEVELOPERPACK_E5"}
$user = Get-MgUser | Where-Object {$_.DisplayName -eq "Adele Vance"}

Set-MgUserLicense -UserId $user.Id -AddLicenses @{SkuId = ($license.SkuId)} -RemoveLicenses @()

El parámetro -AllLicenses también le permite asignar varias licencias al mismo tiempo, agregando varias licencias a una tabla hash. Hay un par de maneras en que podemos lograr esto...

Primero, podemos tomar todas las licencias asignadas a un solo usuario (como plantilla) y asignarlas a otro usuario. Comience utilizando el cmdlet Get-MgUserLicenseDetail para almacenar la licencia asignada en una variable.

$lic = Get-MgUserLicenseDetail -UserId $ID

Luego necesitamos crear una serie de hastables que podamos incluir en nuestro comando Set-MgUserLicense.

$addlicense = @()
ForEach ($L in $Lic) {
	$addlicense += @{SkuId = ($($L.SkuId))}
}

Veamos lo que hemos hecho, aquí está el antes y el después:

Puede ver en lo anterior que antes teníamos una lista de objetos para cada licencia, pero después tenemos una serie de hastables que contienen los pares clave-valor para cada licencia. Esto es lo que debemos incluir en nuestro comando para asignar múltiples licencias a un usuario o usuarios.

Set-MgUserLicense -UserId $id -AddLicenses $addlicense -RemoveLicenses @()

Hay diferentes formas de crear su tabla hash; en algunos casos, puede ser más fácil crear manualmente su matriz de tabla hash en caso de que planee asignar licencias específicas a varios usuarios. Por ejemplo:

$AADSku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'AAD_PREMIUM'
$IntSku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'INTUNE_A'
$addLicenses = @(
  @{SkuId = $AADSku.SkuId},
  @{SkuId = $IntSku.SkuId}
)

Cómo asignar una licencia a varios usuarios con Microsoft Graph PowerShell

Para asignar una licencia a varios usuarios, primero tenemos que almacenar nuestros usuarios y recorrerlos usando el comando ForEach.

Sus usuarios se pueden obtener de varias maneras, puede usar el cmdlet Get-MgUser para definir su lista de usuarios, de la cual podrá simplemente obtener los atributos de usuario necesarios para el script.

O si ya tiene un CSV que contiene su lista de usuarios, puede importar el CSV y luego obtener la identificación del usuario dentro del bucle.

A continuación se muestra un ejemplo en el que almaceno una lista de usuarios basada en ellos que contienen "@ourcloudnetwork.com" en su atributo de correo, luego asigno a cada usuario una licencia DEVELOPERPACK_E5.

Import-Module Microsoft.Graph.Users, Microsoft.Graph.Users.Actions
Connect-MgGraph -scope User.ReadWrite.All

$users = Get-MgUser | Where-Object {$_.Mail -match "@ourcloudnetwork.com"}
$license = Get-MgSubscribedSku | Where-Object {$_.SkuPartNumber -eq "DEVELOPERPACK_E5"}

ForEach ($user in $users) {
    Write-host "Assigning license: $($license.SkuPartNumber) to $($user.DisplayName)"
    Set-MgUserLicense -UserId $user.Id -AddLicenses @{SkuId = ($license.SkuId)} -RemoveLicenses @()
}

O si desea realizar la misma tarea, pero esta vez, use una lista existente de usuarios que haya guardado en un CSV, puede usar el siguiente script.

Import-Module Microsoft.Graph.Users, Microsoft.Graph.Users.Actions
Connect-MgGraph -scope User.ReadWrite.All

$users = Import-Csv "C:\temp\userlist.csv"
$license = Get-MgSubscribedSku | Where-Object {$_.SkuPartNumber -eq "DEVELOPERPACK_E5"}

ForEach ($user in $users) {
    Write-host "Assigning license: $($license.SkuPartNumber) to $($user.DisplayName)"
    $userid = $null
    $userid = (Get-MgUser -UserId [email ).Id
    Set-MgUserLicense -UserId $user.Id -AddLicenses @{SkuId = ($license.SkuId)} -RemoveLicenses @()
}

Eliminar una licencia de usuario único

Al eliminar una licencia de usuario único, el parámetro -RemoveLicenses no espera una tabla hash, sino solo la cadena SkuId de la licencia. Por ejemplo, para eliminar una única licencia de un usuario, podemos usar el siguiente comando:

$lic = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'INTUNE_A'

Set-MgUserLicense -UserId $ID -AddLicenses @() -RemoveLicenses $lic.SkuId

Podemos ver que este comando es exitoso y solo proporciona el valor de la cadena SkuId en el parámetro.

Eliminar varias licencias

El concepto es similar para eliminar varias licencias a la vez, en comparación con agregar varias licencias. Podemos definir una matriz de valores SkuId en el comando para eliminar varias licencias.

Como antes, hay varias formas de crear su matriz; puede definirla manualmente dentro de su secuencia de comandos o crearla en función de los valores de un usuario existente o de cualquier licencia disponible.

Por ejemplo, para crear una lista de matriz de SkuId específicos, puede utilizar lo siguiente:

$AADSku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'AAD_PREMIUM'
$IntSku = Get-MgSubscribedSku -All | Where SkuPartNumber -eq 'INTUNE_A'
$Lics = "$($AADSku.SkuID)", "$($IntSku.SkuId)"

La matriz tendrá el siguiente aspecto:

Luego, esta matriz se puede incluir en su comando de la siguiente manera para eliminar las licencias especificadas de un solo usuario.

Set-MgUserLicense -UserId $ID -AddLicenses @() -RemoveLicenses $lics

Puede utilizar el ejemplo anterior para ejecutar este comando contra varios usuarios de su organización.

Artículos relacionados