Microsoft obliga a abandonar los cmdlets de Azure AD para la gestión de licencias
Algunos cmdlets dejarán de funcionar en 2022
A veces surge una bendita casualidad, incluso en el mundo de la tecnología. Tal fue el caso de mi sesión de TEC 2021 sobre el uso de Microsoft Graph para administrar inquilinos de Office 365 (disponible en línea) cuando hablé del SDK de Microsoft Graph PowerShell. El equipo organizador grabó las sesiones de TEC con anticipación para garantizar que la conferencia se desarrollara sin problemas, por lo que no pude usar el ejemplo que se me cayó cuando Microsoft anunció que los cmdlets de Azure AD para la administración de licencias dejarán de funcionar el 30 de junio de 2022. ( Actualización del 15 de marzo de 2022: Microsoft ha pospuesto la fecha de retiro hasta el 26 de agosto de 2022).
Esta fue una continuación del aviso que Microsoft dio sobre el futuro de Azure AD Graph en junio. En pocas palabras, Azure AD Graph es un componente más antiguo independiente de Microsoft Graph y se está retirando. Los módulos de Azure AD y Microsoft Online Services que dependen de Azure AD Graph entran en un estado no compatible en 2022. La mayoría de los cmdlets de los módulos seguirán funcionando, pero los cmdlets de administración de licencias dejarán de devolver datos el 30 de junio de 2022 porque Microsoft pasar a una nueva plataforma de gestión de licencias.
Actualización: Microsoft ha retrasado la fecha de desuso de los módulos Azure AD y MSOL hasta finales de 2022.
Obviamente, la desaprobación tiene un efecto en cadena en los muchos scripts que la gente usa para administrar diferentes aspectos de Azure AD, con la necesidad inmediata de encontrar un reemplazo para los cmdlets de administración de licencias antes de que dejen de funcionar. La guía de Microsoft es utilizar la API asignarLicense Graph o el cmdlet Set-MgUserLicense del SDK de Microsoft Graph PowerShell.
Actualización al SDK de Microsoft Graph PowerShell
¿Qué tan difícil puede ser cambiar un cmdlet de Azure AD y reemplazarlo por un cmdlet del SDK? A primera vista, la sustitución debería ser sencilla, pero, como suele ocurrir, esa percepción dura unos cinco minutos. Al menos, eso es lo que descubrí cuando actualicé mi secuencia de comandos para eliminar un plan de servicio único de un SKU (producto) de Office 365 para varias cuentas. Este script utiliza llamadas de Azure AD para procesar información de licencia, por lo que es un buen ejemplo del tipo de script afectado por la fecha límite que se avecina el próximo junio.
El primer problema que encontré fue la documentación de los cmdlets del SDK. Según tengo entendido, Microsoft genera gran parte de la documentación a partir del código, lo que explica algunas frases extrañas y la naturaleza totalmente incomprensible del texto. Naturalmente, gemí amargamente y, después de sondear un poco, descubrí algunos consejos útiles que me indicaron la dirección correcta.
Pasos para actualizar
El SDK de Microsoft Graph PowerShell admite la autenticación delegada y solo de aplicación. En este ejemplo, usaremos el acceso delegado para obtener un token de acceso de Azure AD, principalmente porque esto es lo que sucede en la versión del script basada en Azure AD. En resumen, estos son los pasos que seguí para actualizar el código:
Conéctese al gráfico. El cmdlet Connect-MgGraph se conecta al gráfico. La solicitud de conexión puede especificar los permisos necesarios para interactuar con los datos. Por ejemplo, esta conexión solicita permisos para leer y escribir información del directorio.
Connect-MgGraph -Scopes "User.ReadWrite.All","Directory.ReadWrite.All"Seleccione el perfil Beta. Las API de Graph vienen en diferentes versiones (normalmente, V1.0 para producción completa y Beta para desarrollo). La información de administración de licencias para cuentas de usuario está disponible mediante el cmdlet Get-MgUser solo si selecciona el perfil Beta. Este código verifica el perfil cargado y selecciona la Beta si no está configurada.
$Profile = (Get-MgProfile).Name
If ($Profile -ne "beta") { Select-MgProfile Beta }
Obtenga las licencias de producto (SKU) en el inquilino. El script permite al administrador seleccionar un plan de servicio individual (como Formularios, Pizarra o Planificador) para eliminarlo de un SKU (como Office 365 E3). Para permitir que el administrador elija, recuperamos la lista de SKU disponibles en el inquilino mediante el cmdlet Get-MgSubscribedSku.
[array]$Skus = (Get-MgSubscribedSku)Luego podemos usar la información de SKU para presentar menús de SKU y planes de servicio al administrador para que elija el plan de servicio que desea eliminar. El resultado es un SKU seleccionado y un plan de servicio seleccionado, ambos identificados como GUID.
Seleccione las cuentas de usuario a procesar. El cmdlet Get-MgUser es una buena manera de seleccionar un conjunto de cuentas de Azure AD para su procesamiento. Por ejemplo, para encontrar todas las cuentas a las que se les ha asignado un SKU específico, puedes usar un comando como:
[array]$Users = Get-MgUser -Filter "assignedLicenses/any(x:x/skuId eq $SelectedSkuId)" -allSin embargo, este script utiliza Get-ExoMailbox porque sus capacidades de filtrado son superiores. Lo importante es tener un conjunto de GUID de cuenta o nombres principales de usuario para utilizar como entrada cuando el código actualice la información de la licencia. Get-ExoMailbox puede proporcionar esta información, por lo que no actualicé esta sección del código.
Procesar información de licencia para cuentas. El script recorre el conjunto de cuentas seleccionadas para recuperar la información de la licencia actual (usando Get-MgUser) y luego crea un objeto de licencia (MicrosoftGraphAssignedLicense) que contiene información sobre los planes de servicio que ya existen. deshabilitado para la cuenta más el plan de servicio que queremos eliminar ahora. Después de completar el objeto de licencia, llamamos a Set-MgUserLicense para aplicar la actualización.
$ExistingDisabledPlans = $Null
ForEach ($S in $User.AssignedLicenses) { # Check for existing disabled licenses
If ($S.SkuId -eq $SelectedSkuId) {
$ExistingDisabledPlans = $S.DisabledPlans }
}
$ExistingDisabledPlans += $ServicePlanId # Add the plan we want to remove to the set of disabled plans
$LicenseToRemove = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense
$LicenseToRemove.SkuId = $SelectedSkuId
$LicenseToRemove.DisabledPlans = $ExistingDisabledPlans
$Status = Set-MgUserLicense -UserId $User.id -AddLicenses $LicenseToRemove -RemoveLicenses @()
}
Sería el primero en decir que la sintaxis de Set-MgUserLicense es un poco extraña. Dado que la sintaxis para agregar un nuevo SKU a una cuenta es:
$User = Get-MgUser -UserId Imran.Khan@office365itpros.com
$NewSkuId ="8c4ce438-32a7-4ac5-91a6-e22ae08d9c8b"
Set-MgUserLicense -UserId $User.id -AddLicenses @{SkuId = $NewSkuId} -RemoveLicenses @()
Esperaba usar el objeto de licencia con el parámetro RemoveLicenses en lugar de AddLicenses, pero esa no es la forma en que esperaba actualizar el objeto de licencia pasando información en el RemoveLicenses parámetro en lugar de AddLicenses, pero así no es como funcionan las cosas. Agregar un nuevo SKU a una cuenta habilita todos los planes de servicio contenidos en el SKU. En este caso, pasamos información de licencia actualizada para indicarle a Graph que deshabilite los planes de servicio especificados del SKU especificado. Sería bueno si la documentación fuera más clara sobre este tema.
Tenga en cuenta que es necesario pasar una matriz en blanco a RemoveLicenses para que el cmdlet esté satisfecho. El parámetro requiere un valor incluso si está en blanco y se opondrá si no encuentra nada pasado.
Eliminar licencias de cuentas
Para eliminar una o más licencias de productos (SKU) de una cuenta, el proceso es:
- Cree una serie de licencias de productos para eliminar. Puede eliminar varias licencias de productos a la vez. La matriz contiene los GUID que identifican los SKU del producto que se eliminarán.
- Ejecute Set-MgUserLicense y pase la matriz como parámetro RemoveLicenses. Esta vez pasamos una matriz en blanco al parámetro AddLicenses para crear el contenido del cmdlet. Este ejemplo elimina dos productos de una cuenta:
[array]$SkuToRemove = "1f2f344a-700d-42c9-9427-5cea1d5d7ba6", "4016f256-b063-4864-816e-d818aad600c9"
Set-MgUserLicense -UserId $User.id -RemoveLicenses $SkuToRemove -AddLicenses @()
Validación de la eliminación del plan de servicio
Para probar que todo funcionó, utilicé el script para eliminar el plan de servicio MyAnalytics (que Microsoft está cambiando el nombre a Viva Insights) de un grupo de cuentas de Office 365 E3. Todo salió bien para actualizar las asignaciones de licencias para las cuentas. Puede verificar las asignaciones con PowerShell o viendo la información del usuario a través del centro de administración de Microsoft 365 (Figura 1).
¿Cuánto tiempo se debe actualizar?
Estoy seguro de que la gente estará preocupada por el tiempo necesario para actualizar los scripts de PowerShell antes de que caiga el martillo el 30 de junio. Existen varias variables, entre ellas:
- Familiaridad del desarrollador con el SDK de Microsoft Graph PowerShell.
- Con qué rapidez Microsoft mejora el SDK y su documentación.
- La complejidad de los scripts existentes y cuántos cmdlets de administración de licencias de Azure AD o Microsoft Online Services deben reemplazarse.
- El entorno donde se ejecutan los scripts (por ejemplo, el método de autenticación utilizado).
Nos quedan poco más de nueve meses antes de que los cmdlets más antiguos dejen de funcionar. Es probable que la cantidad de scripts afectados en un inquilino sea pequeña y no es necesario reescribir todo desde cero. Es decir, a menos que haya creado su propia solución de administración de licencias. Si ese es el caso, tienes trabajo que hacer. De lo contrario, la actualización de la mayoría de los scripts debería ser cuestión de días y no de semanas.
Explore y descubra antes de que el módulo desaparezca
Puedes obtener una copia de mi script en GitHub. Como recordatorio, este es un código escrito para explorar y demostrar un principio en lugar de ser una solución de calidad de producción. Utilice el código para aprender, explorar e interactuar con la administración de licencias a través del SDK de Microsoft Graph PowerShell. Trabajar con el SDK será más fácil con el tiempo. Al menos, si no es así, Microsoft podría tener algunos clientes descontentos cuando se produzca la desaprobación. Es hora de empezar a codificar.
