M365Con 2027 – conferencia online gratuita · 11–22 Jan 2027 · 120 sessions→ m365con.net

Blog · Mirko Peters

Automatización de la optimización de licencias y auditorías en Microsoft 365

By ·

¡Bienvenido de nuevo al blog del podcast! Si alguna vez has mirado fijamente tu factura mensual de software de Microsoft 365 y te has preguntado por qué pagas licencias que nadie ha usado…

Automatically translated with AI from the original post. Read the English original

▶ BLOGAutomating LicenseOptimization and Audits…M365.FM
Titelbild: Automating License Optimization and Audits in Microsoft 365

¡Bienvenido de nuevo al blog del podcast! Si alguna vez has mirado la factura mensual de software de Microsoft 365 y te has preguntado por qué pagas por puestos que nadie ha usado en seis meses, no eres el único. La gestión de licencias es uno de esos gastos operativos ocultos que desangran silenciosamente los presupuestos de TI y, al mismo tiempo, generan dolores de cabeza innecesarios en cumplimiento y seguridad. Afortunadamente, tenemos herramientas de automatización muy potentes al alcance de la mano. En esta guía completa veremos cómo hacer seguimiento, asignar y revocar licencias de Microsoft 365 con PowerShell para controlar costes, agilizar los procesos de incorporación y garantizar un cumplimiento estricto en todo el inquilino. Si te interesan las estrategias de automatización técnica en profundidad, no dejes de consultar nuestro episodio relacionado sobre cómo Run Your Full Stack Locally with .NET Aspire para obtener más información sobre flujos de trabajo y herramientas para desarrolladores.

Introducción a la automatización de la optimización de licencias y auditorías

Administrar manualmente un inquilino de Microsoft 365 es una receta para el agotamiento y el error humano. A medida que las organizaciones crecen, los empleados rotan, los departamentos cambian y los requisitos de software fluctúan notablemente. Si no se controla, los administradores acaban acumulando licencias, siguen pagando a antiguos contratistas o dejan licencias E5 premium asignadas a cuentas inactivas. Al introducir la automatización en tu estrategia de optimización de licencias, eliminas las conjeturas. PowerShell te permite consultar datos del inquilino, analizar patrones de uso y recuperar de forma programática los recursos no utilizados, convirtiendo una tarea administrativa reactiva en una protección financiera proactiva.

Requisitos previos y configuración del entorno

Antes de escribir una sola línea de código para recuperar licencias, debes preparar tu entorno. Una preparación adecuada garantiza que tus scripts se ejecuten sin problemas y sin encontrarte con bloqueos de permisos ni conflictos de ensamblados de módulos.

Sistemas compatibles

Puedes ejecutar tus scripts de administración de Microsoft 365 tanto en sistemas Windows como en macOS. La mayoría de los administradores prefieren Windows 10 o posterior, mientras que los usuarios de Mac pueden aprovechar PowerShell Core. Asegúrate siempre de que tu sistema operativo admita los últimos paquetes modulares. Si encuentras errores de integración de Web Account Manager (WAM) o conflictos de dependencias de ensamblados al conectarte a los servicios, usar soluciones temporales como el modificador DisableWAM puede permitir que tus scripts sigan funcionando.

Permisos y roles

La seguridad es lo primero. Nunca ejecutes scripts administrativos con una cuenta de usuario estándar. Asegúrate de que la identidad que ejecuta el script tenga los roles adecuados, como Administrador global, Administrador de usuarios o Administrador de licencias. Aplicar el principio de mínimo privilegio garantiza que tus credenciales administrativas tengan solo los permisos exactos necesarios para realizar auditorías y asignaciones de licencias.

Lista de comprobación de configuración del entorno

  1. Abre Windows PowerShell como administrador.
  2. Establece PowerShell Gallery como repositorio de confianza:
    Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted
  3. Instala el proveedor NuGet necesario si se te solicita.
  4. Configura la directiva de ejecución de scripts:
    Set-ExecutionPolicy RemoteSigned

Instalación de los módulos esenciales de PowerShell para Microsoft 365

Para gestionar usuarios y licencias de forma eficaz, necesitas tener instaladas en local las herramientas adecuadas. El ecosistema de Microsoft ha evolucionado considerablemente hacia SDK unificados, pero varios módulos fundamentales siguen siendo esenciales para las tareas administrativas del día a día.

Descripción general de los módulos

  • Microsoft.Graph: el módulo unificado moderno que sustituye a herramientas heredadas como MSOnline y AzureAD.
  • ExchangeOnlineManagement: esencial para la gobernanza de buzones, la conversión de buzones compartidos y el seguimiento del flujo de correo.
  • MicrosoftTeams: esencial para administrar cargas de trabajo de colaboración y directivas de reuniones.

Pasos de instalación

Puedes instalar los módulos modernos principales ejecutando los siguientes comandos en una sesión de PowerShell elevada:

Install-Module -Name Microsoft.Graph -Scope CurrentUser -Force
Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser -Force
Install-Module -Name MicrosoftTeams -Scope CurrentUser -Force

Verifica siempre tus instalaciones con Get-InstalledModule para asegurarte de que las versiones en conflicto no interrumpan tus runbooks de automatización.

Conexión de PowerShell a tu inquilino de Microsoft 365

Establecer una conexión segura y fiable con tu inquilino es el siguiente paso crítico. Los estándares de autenticación modernos requieren enfoques robustos, sobre todo al ejecutar scripts desatendidos o programados.

Opciones de autenticación

Los inicios de sesión interactivos son ideales para tareas administrativas rápidas y puntuales, pero los scripts automatizados en segundo plano requieren alternativas seguras. Usar autenticación basada en certificados o identidades administradas te permite conectarte de forma segura sin incluir contraseñas en texto plano dentro de los archivos de script.

Conectarse a Graph y a los servicios

Para conectarte al backend de Microsoft Graph para la gestión de usuarios y licencias, usa:

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

Para cargas de trabajo específicas de Exchange y configuraciones de buzones, establece tu sesión con:

Connect-ExchangeOnline

Cuando tu script termine de ejecutar sus operaciones por lotes, no olvides cerrar la sesión ejecutando Disconnect-ExchangeOnline o Disconnect-MgGraph.

Auditar asientos sin uso e inventarios de licencias

La optimización de licencias empieza por la visibilidad. No puedes recuperar asientos si no sabes quién los utiliza y quién los ha abandonado. Con PowerShell puedes extraer informes completos del inventario que detallen los SKU asignados y las fechas de la última sesión iniciada.

Comprobar los SKU suscritos

Para comprobar el total de licencias compradas de tu inquilino frente a los recuentos disponibles, ejecuta el siguiente comando:

Get-MgSubscribedSku | Select-Object SkuId, SkuPartNumber, @{Name="Total";Expression={$_.ConsolidatedStatus}}, @{Name="Assigned";Expression={$_.AssignedUnits}}

Buscar usuarios inactivos

Identificar las cuentas que no se han autenticado en más de 90 días es la forma más rápida de reducir gastos innecesarios en la nube. Puedes filtrar las listas de usuarios para localizar las cuentas inactivas:

$Threshold = (Get-Date).AddDays(-90)
Get-MgGet-MgUser -All -Property Id, DisplayName, UserPrincipalName, SignInActivity | Where-Object { $_.SignInActivity.LastSignInDateTime -lt $Threshold }

Exportar estos datos a un archivo CSV te permite presentar a la dirección de TI métricas claras de ahorro antes de ejecutar eliminaciones masivas de licencias.

Usar Set-MgUserLicense para asignar y revocar licencias

Una vez identificados los asientos infrautilizados o las nuevas incorporaciones que necesitan alta, el cmdlet Set-MgUserLicense se convierte en tu mecanismo principal de ajuste.

Asignar licencias mediante programación

Para asignar un SKU de producto específico a un nuevo usuario, construyes un objeto de asignación de licencia que contenga el SkuId de destino:

$Params = @{
    AddLicenses = @(
        @{
            SkuId = "your-sku-guid-here"
        }
    )
    RemoveLicenses = @()
}
Set-MgUserLicense -UserId "alex.johnson@contoso.com" -BodyParameter $Params

Revocar licencias no utilizadas

Cuando recuperes licencias de cuentas inactivas o de personal que ya no forma parte de la organización, inviertes la operación pasando el identificador del SKU al parámetro de matriz RemoveLicenses, de modo que tu organización deje de pagar de inmediato por capacidad de nube sin uso.

Automatizar los flujos de alta y baja de licencias

El aprovisionamiento y desaprovisionamiento manual de usuarios introduce una latencia considerable y riesgos de seguridad. Al automatizar tus flujos de alta y baja mediante scripts, garantizas que las licencias se asignen en el momento en que un empleado se incorpora y que se revoquen de inmediato el día que se marcha.

Un script de baja automatizado puede deshabilitar la cuenta del usuario, quitar las licencias asignadas, convertir su buzón en un recurso compartido y exportar los registros de auditoría a una ubicación de almacenamiento segura, todo en un único bloque de ejecución continua. Este nivel de sincronización elimina el desperdicio de licencias y preserva la postura de seguridad de la organización.

Buenas prácticas de seguridad y privilegio mínimo

La automatización concede un poder enorme, por lo que debe gobernarse con rigor. Seguir principios de seguridad estrictos protege tu inquilino de configuraciones erróneas accidentales y de la ejecución de scripts maliciosos.

  • Acceso con privilegio mínimo: nunca concedas derechos de administrador global a cuentas de servicio automatizadas. Limita los permisos estrictamente a lo que el script realmente necesita.
  • Seguridad de las credenciales: nunca almacenes contraseñas en texto plano dentro de los scripts. Usa Azure Key Vault, identidades administradas o autenticación por certificado.
  • Registro completo: implementa bloques try/catch robustos y registra los pasos de ejecución del script en registros locales o en la nube para disponer de trazabilidad completa.

Solución de problemas comunes de licencias y conexión

Incluso los administradores experimentados se topan a veces con obstáculos al ejecutar scripts de automatización de Microsoft 365. Saber cómo gestionar estos errores te ahorrará horas de frustración.

  1. Errores de permisos denegados: comprueba que la cuenta que ejecuta el script tiene los roles de directorio de Azure AD necesarios y que la conexión a Graph solicitó los ámbitos de consentimiento correctos.
  2. Errores en la asignación de licencias: asegúrate de que el usuario de destino tiene configurada una «Ubicación de uso». Microsoft 365 rechazará las asignaciones de licencia si el campo del país del usuario está vacío.
  3. Conflictos de módulos: si los cmdlets fallan por versiones de módulo en conflicto, desinstala por completo los módulos heredados (como MSOnline) y unifica tu entorno con el SDK moderno de Microsoft Graph.

Conclusión

Automatizar la optimización de licencias y las auditorías en Microsoft 365 une una administración de TI eficiente con una gestión financiera inteligente. Si usas PowerShell y cmdlets como Set-MgUserLicense, puedes eliminar el gasto innecesario en software, aplicar un cumplimiento de seguridad estricto y agilizar los flujos de administración de usuarios en toda tu organización. Si quieres ampliar aún más tus conocimientos técnicos en herramientas modernas y gestión de infraestructura, no dejes de consultar nuestro episodio relacionado sobre cómo ejecutar toda tu pila localmente con .NET Aspire. Mantente proactivo, protege tus scripts y convierte tu inquilino de Microsoft 365 en un motor bien engrasado y optimizado en costes.

Entities in this article

PowerShell Microsoft 365 Least privilege Automation .NET Aspire Global Administrator Compliance Burnout Microsoft Graph NuGet

Related articles

RSS