Azure PowerShell es el conjunto de módulos oficiales de Microsoft para administrar Azure desde la consola: crear y apagar máquinas virtuales, revisar discos, etiquetar recursos, cambiar de suscripción o saber quién tiene permisos. Esta guía explica cómo instalar Azure PowerShell, cómo conectarse con Connect-AzAccount, cómo moverse entre suscripciones con Set-AzContext, qué comandos se usan a diario, cuándo conviene elegir entre Azure CLI vs PowerShell y cómo dejar un script funcionando sin nadie delante. Además, lo que no viene de la documentación de Microsoft lo medimos el 28 de octubre de 2026 en un Windows 11 sin permisos de administrador, con Windows PowerShell 5.1 y con PowerShell 7.6.9.
La guía tiene dos niveles. Si solo quiere ejecutar unos comandos, lea los apartados de instalación, conexión y comandos comunes. En cambio, si administra varias suscripciones o quiere automatizar, siga hasta la autenticación sin intervención y los escenarios. Por último, para un primer contacto con la consola, antes conviene leer nuestra guía de PowerShell y la de módulos de PowerShell.
Qué es Azure PowerShell
En primer lugar, Azure PowerShell es el nombre del producto; el módulo que se instala se llama Az. Según la documentación de Microsoft, Az es un módulo «contenedor»: no trae comandos propios, sino que agrupa un submódulo por servicio, como Az.Compute para las máquinas virtuales o Az.Network para las redes. Todos dependen de Az.Accounts, que se encarga del inicio de sesión. Por otra parte, cada comando llama a la API de Azure Resource Manager, la misma que usa el portal, y devuelve objetos de .NET, no texto.
El día de la prueba, en concreto, la Galería de PowerShell publicaba Az 16.4.0, del 6 de octubre de 2026, con 102 submódulos. Por eso conviene distinguirlo de otros módulos que aparecen en internet con nombres parecidos:
| Nombre | Qué es | Estado |
|---|---|---|
| Az | Azure PowerShell actual: recursos de Azure | Vigente (16.4.0) |
| AzPreview | Az más los módulos en versión preliminar (207 en total) | No recomendado en producción |
| AzureRM | La generación anterior de Azure PowerShell | Retirado el 29 de febrero de 2024 |
| Azure | Módulo para el modelo clásico (Azure Service Manager) | Heredado, solo para recursos clásicos |
| AzureAD y MSOnline | Usuarios y licencias de Entra ID y Microsoft 365 | Retirados; se usa Microsoft Graph |
Ojo con AzureRM, que Microsoft dio por retirado: medimos que la Galería todavía lo encuentra (versión 6.13.2, de marzo de 2021), así que Install-Module AzureRM sigue funcionando aunque Microsoft ya no lo mantenga. AzureAD, en cambio, ya no aparece. Si su tarea es de usuarios o licencias de Microsoft 365, la herramienta es otra, y la explicamos en la guía de Microsoft 365 PowerShell.
Para qué sirve Azure PowerShell: usos comunes y beneficios
El portal de Azure es cómodo para ver un recurso. Sin embargo, se vuelve lento cuando hay que repetir la misma tarea en cuarenta máquinas o en cinco suscripciones. Ahí, precisamente, es donde Azure PowerShell ahorra tiempo:
- Inventarios: qué máquinas hay, en qué región, de qué tamaño y si están encendidas, en todas las suscripciones a la vez.
- Costos: encontrar discos sin conectar, direcciones IP públicas sin uso o máquinas que nadie apaga.
- Orden: revisar y poner etiquetas, mover recursos de grupo, borrar entornos de prueba completos.
- Permisos: saber quién es Propietario de qué, y dar o quitar roles.
- Automatización: tareas programadas o runbooks de Azure Automation que se ejecutan solos, sin pasar por el portal.
- Copias y recuperación: las guías de Azure Backup y Azure Site Recovery usan comandos de este mismo módulo.
Usar Azure PowerShell en lugar del portal tiene, además, beneficios claros:
- Se repite igual: un script hace lo mismo hoy y dentro de un año, sin clics olvidados.
- Trabaja con objetos: se filtra con
Where-Object, se ordena conSort-Objecty se exporta a CSV sin copiar a mano. - Queda escrito: el script sirve como documentación de lo que se hizo.
- Permite probar antes: muchos comandos admiten
-WhatIf, que muestra el cambio sin aplicarlo.
Azure CLI vs PowerShell: cuál usar
La duda de Azure CLI vs PowerShell aparece pronto, porque Azure tiene dos herramientas de línea de comandos y, además, una consola en el navegador. La comparativa de Microsoft lo resume así: Azure CLI se parece a Bash y Azure PowerShell sigue la forma Verbo-Sustantivo de PowerShell y devuelve objetos. Ambas sirven en Windows, Linux y macOS, pero no siempre cubren las mismas funciones de cada servicio.
| Aspecto | Azure PowerShell | Azure CLI |
|---|---|---|
| Qué es | Un módulo de PowerShell (Az) | Un programa, az |
| Dónde se ejecuta | Windows PowerShell 5.1 o PowerShell 7 | Cmd, Bash, Windows PowerShell o PowerShell |
| Forma de los comandos | Get-AzVM | az vm list |
| Qué devuelve | Objetos de .NET | Texto JSON (o tabla) |
| Mejor para | Quien ya trabaja con Windows y PowerShell | Quien trabaja con Linux y Bash |
Las mismas tareas, en una y otra:
| Tarea | Azure CLI | Azure PowerShell |
|---|---|---|
| Iniciar sesión | az login | Connect-AzAccount |
| Ver las suscripciones | az account list | Get-AzSubscription |
| Elegir una suscripción | az account set --subscription '<id>' | Set-AzContext -Subscription '<id>' |
| Ver las regiones | az account list-locations | Get-AzLocation |
| Ver la versión | az --version | Get-InstalledModule -Name Az |
En resumen, en Azure CLI vs PowerShell no hay una ganadora: gana la que ya conoce su equipo. Por otra parte, Azure Cloud Shell no es una tercera herramienta, sino un lugar donde ejecutar las otras dos. Es una consola que se abre desde el portal o desde shell.azure.com, ya con sesión iniciada y con Azure PowerShell y Azure CLI instalados. Según Microsoft, corre en un contenedor de Linux, se cierra tras 20 minutos sin actividad y guarda sus archivos en un recurso compartido de 5 GB, que se cobra como almacenamiento normal. Es la forma más rápida de probar un comando, pero no sirve para lo que dependa de Windows.
Requisitos para instalar Azure PowerShell
| Requisito | PowerShell 7 (recomendado) | Windows PowerShell 5.1 |
|---|---|---|
| Versión | Una versión con soporte de PowerShell 7 | 5.1, con .NET Framework 4.7.2 o posterior |
| Gestor de módulos | PSResourceGet, incluido desde la 7.4 | PowerShellGet actualizado (el 1.0.0.1 de fábrica no sirve) |
| Directiva de ejecución | No hace falta cambiarla en la mayoría de equipos | RemoteSigned para el usuario actual |
| Permisos | Ninguno, si se instala para su usuario | Ninguno, si se instala para su usuario |
Antes de instalar Azure PowerShell, conviene saber que los 103 manifiestos que descargamos declaran compatibilidad con las dos consolas y piden como mínimo PowerShell 5.1 y .NET Framework 4.7.2. Aun así, Microsoft recomienda PowerShell 7, y más adelante verá por qué. Para comprobar qué tiene el equipo:
$PSVersionTable.PSVersion
Get-Module -Name Az.Accounts -ListAvailable | Select-Object Name, Version, ModuleBase
Get-Module -Name AzureRM* -ListAvailable
Si el último comando devuelve algo, hay AzureRM instalado. En ese caso, por tanto, lea antes el apartado de errores: Microsoft no admite tener AzureRM y Az en la misma consola de Windows PowerShell 5.1.
Cómo instalar Azure PowerShell
Hay tres formas de instalar Azure PowerShell y, como verá, no tardan lo mismo. Para compararlas, las medimos descargando Az 16.4.0 completo a una carpeta temporal, con la misma conexión:
| Método | Tiempo | Qué se descargó |
|---|---|---|
Save-PSResource (PSResourceGet, motor de Install-PSResource) | 145,8 s | 103 módulos, 2.730 archivos, 620,4 MB |
Save-Module (PowerShellGet 2.2.5, motor de Install-Module) | 236,9 s | 103 módulos, 2.730 archivos, 620,4 MB |
Save-PSResource solo de Az.Compute y Az.Resources | 12,2 s | 3 módulos (con Az.Accounts), 77,9 MB |
La diferencia tiene explicación: según la guía de instalación optimizada, Install-Module descarga Az.Accounts una vez por cada submódulo, y PSResourceGet lo descarga una sola vez. Por eso la forma recomendada en PowerShell 7 es esta:
Install-PSResource -Name Az -Scope CurrentUser -TrustRepository
En Windows PowerShell 5.1, o si prefiere el comando clásico, la instalación para su usuario es esta otra. Antes, eso sí, actualice PowerShellGet, como explicamos en la guía de módulos de PowerShell.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Install-Module -Name Az -Repository PSGallery -Scope CurrentUser -Force
Instalar solo lo que necesita
Instalar Azure PowerShell completo trae 102 submódulos, aunque use tres. En cambio, para inventariar máquinas virtuales, redes y almacenamiento basta con esto, y Az.Accounts se instala solo:
Install-PSResource -Name Az.Compute, Az.Network, Az.Resources, Az.Storage -Scope CurrentUser -TrustRepository
Es la opción que recomendamos en equipos de trabajo: ocupa una fracción, se actualiza antes y, sobre todo, carga mucho más rápido, como verá en el apartado de rendimiento.
El instalador MSI
Además, Microsoft publica un instalador MSI en GitHub, pensado para instalar Azure PowerShell en equipos sin acceso a la Galería. El de la 16.4.0 para 64 bits pesa 130,6 MB. Sin embargo, tiene dos límites: solo sirve para Windows PowerShell 5.1 y, además, se desinstala desde Configuración, no con Uninstall-Module.
Conectarse a Azure con Connect-AzAccount
Después de instalar Azure PowerShell, el primer comando de cada sesión es Connect-AzAccount:
Connect-AzAccount
Sin embargo, en Windows 10, Windows 11 y Windows Server 2019 o posterior, desde Az 12.0.0, Connect-AzAccount no abre el navegador: usa el Administrador de cuentas web de Windows (WAM), un componente del sistema que gestiona el inicio de sesión y admite Windows Hello y llaves FIDO. Además, si la cuenta tiene varias suscripciones, Connect-AzAccount muestra una lista numerada y pide elegir una; la próxima vez marca con un asterisco la última elegida.
Las variantes más útiles de Connect-AzAccount:
| Situación | Comando |
|---|---|
| Inicio de sesión normal | Connect-AzAccount |
| La cuenta pertenece a varios inquilinos | Connect-AzAccount -Tenant 'contoso.onmicrosoft.com' |
| Equipo sin navegador o ventana que no aparece | Connect-AzAccount -UseDeviceAuthentication |
| Entrar directamente en una suscripción | Connect-AzAccount -Subscription 'Producción' |
| Sesión que no se guarda al cerrar la consola | Connect-AzAccount -Scope Process |
| Nube soberana (por ejemplo, China) | Connect-AzAccount -Environment AzureChinaCloud |
La autenticación multifactor ya es obligatoria
Microsoft exige autenticación multifactor obligatoria (MFA) para crear, cambiar o borrar recursos desde Azure PowerShell, Azure CLI y la API de Azure desde el 1 de octubre de 2025. Las organizaciones que lo pidieron pudieron aplazarlo, como mucho, hasta el 1 de julio de 2026; ese plazo ya terminó. Leer recursos no lo exige. En la práctica, esto significa dos cosas:
- Un script que inicia sesión con usuario y contraseña (
Connect-AzAccount -Credential) ya no sirve para cambiar nada, porque ese método no admite MFA. Si la cuenta tiene la MFA exigida al iniciar sesión, ni siquiera entra: Microsoft documenta el errorUsernamePasswordCredential authentication failed. - Si inicia sesión sin MFA e intenta crear algo, Azure responde
Users must authenticate with multi-factor authentication to create or update resources.y pide volver a entrar con-ClaimsChallenge.
Por eso, para recibir esos mensajes completos, Microsoft pide Az 14.3.0 o posterior. Con versiones anteriores, el error es el poco claro SharedTokenCacheCredential authentication unavailable.
Suscripciones y contexto con Set-AzContext
Todo comando de Azure PowerShell se ejecuta contra una suscripción: la del contexto activo. Es decir, el contexto guarda la cuenta, la suscripción, el inquilino y una referencia a los tokens. Por eso, antes de cambiar algo, conviene mirar dónde está:
Get-AzContext
Get-AzSubscription | Select-Object Name, Id, State, TenantId
Set-AzContext -Subscription 'Producción'
Set-AzContext cambia de suscripción sin volver a pedir la contraseña. Además, acepta el nombre o el identificador; con varias suscripciones de nombre parecido, use siempre el identificador. Además, si siempre trabaja en la misma, puede fijarla para que Connect-AzAccount no pregunte:
Update-AzConfig -DefaultSubscriptionForLogin 'Producción'
Sin embargo, hay un detalle que confunde a muchos: los contextos se guardan entre sesiones. Según la página de los objetos de contexto, Azure PowerShell los almacena en la carpeta .Azure de su perfil, así que al abrir otra consola puede seguir conectado a la última suscripción usada. De hecho, en nuestra prueba bastó con cargar Az.Accounts, sin iniciar sesión, para que aparecieran ocho archivos en esa carpeta, entre ellos AzureRmContext.json y una caché de claves. Por eso, en un equipo compartido o en un servidor de saltos, conviene una de estas tres opciones:
| Qué quiere | Comando |
|---|---|
| Que la sesión no se guarde | Connect-AzAccount -Scope Process |
| Cerrar la sesión de la cuenta actual | Disconnect-AzAccount |
| Borrar todos los contextos y tokens guardados | Clear-AzContext -Force |
Comandos más comunes de Azure PowerShell
Los comandos de Azure PowerShell siguen la forma Verbo-AzSustantivo: Get-AzVM, New-AzResourceGroup, Remove-AzDisk. Por eso, si sabe cómo se llama el recurso, casi puede adivinar el comando. Esta es la lista que más se usa en soporte y administración:
| Área | Comando | Para qué sirve | Módulo |
|---|---|---|---|
| Sesión | Connect-AzAccount | Iniciar sesión | Az.Accounts |
| Sesión | Get-AzContext / Set-AzContext | Ver o cambiar la suscripción activa | Az.Accounts |
| Sesión | Get-AzSubscription | Listar las suscripciones de la cuenta | Az.Accounts |
| Recursos | Get-AzResourceGroup / New-AzResourceGroup | Ver o crear grupos de recursos | Az.Resources |
| Recursos | Get-AzResource | Listar recursos de cualquier tipo | Az.Resources |
| Recursos | Update-AzTag | Añadir, reemplazar o quitar etiquetas | Az.Resources |
| Recursos | Remove-AzResourceGroup | Borrar un grupo con todo lo que contiene | Az.Resources |
| Máquinas virtuales | Get-AzVM | Listar máquinas; con -Status, su estado | Az.Compute |
| Máquinas virtuales | Start-AzVM / Stop-AzVM / Restart-AzVM | Encender, apagar o reiniciar | Az.Compute |
| Discos | Get-AzDisk | Listar discos administrados | Az.Compute |
| Redes | Get-AzVirtualNetwork / Get-AzPublicIpAddress | Redes y direcciones IP públicas | Az.Network |
| Almacenamiento | Get-AzStorageAccount | Cuentas de almacenamiento | Az.Storage |
| Permisos | Get-AzRoleAssignment / New-AzRoleAssignment | Ver o asignar roles | Az.Resources |
| Consultas | Search-AzGraph | Consultar todas las suscripciones a la vez | Az.ResourceGraph |
| Regiones | Get-AzLocation | Ver las regiones disponibles | Az.Resources |
Para descubrir el resto, en cambio, PowerShell trae sus propias herramientas:
Get-Command -Module Az.Compute -Verb Get
Get-Help Get-AzVM -Examples
Dos parámetros merecen un aviso. Primero, Stop-AzVM desasigna la máquina por defecto, que es lo que deja de cobrar el cómputo; con -StayProvisioned la apaga sin desasignarla y, según Microsoft, «la cuenta sigue pagando la máquina detenida». Segundo, Search-AzGraph devuelve 100 resultados si no se indica otra cosa, y como mucho 1.000 por llamada con -First: un inventario de 340 recursos hecho sin -First trae solo los primeros 100.
Configuración de Azure PowerShell con Update-AzConfig
Por otra parte, Azure PowerShell tiene su propia configuración, separada de la de PowerShell. Se consulta con Get-AzConfig y se cambia con Update-AzConfig. Estos son los ajustes que más conviene conocer:
| Ajuste | Qué hace | Cuándo cambiarlo |
|---|---|---|
DefaultSubscriptionForLogin | Suscripción que Connect-AzAccount elige al entrar | Si siempre trabaja en la misma |
EnableLoginByWam | Inicio de sesión con WAM en Windows | Ponerlo en $false si la ventana no aparece o usa Windows PowerShell ISE |
LoginExperienceV2 | La lista para elegir suscripción al entrar | Off en scripts que no deben preguntar |
EnableDataCollection | Envío de telemetría de uso a Microsoft | $false si su política lo exige |
DisplayBreakingChangeWarning | Avisos de cambios que vienen | $false en scripts, para limpiar la salida |
CheckForUpgrade | Aviso de versión nueva al cargar | Según prefiera |
En el equipo de prueba, con Az.Accounts 5.5.3 recién descargado, Get-AzConfig mostró EnableLoginByWam en True, LoginExperienceV2 en On, DisplayBreakingChangeWarning en True y CheckForUpgrade en True, sin suscripción predeterminada. Para revisarlo y cambiarlo:
Get-AzConfig | Select-Object Key, Value, Scope
Update-AzConfig -EnableDataCollection $false
Update-AzConfig -DisplayBreakingChangeWarning $false -Scope Process
Con -Scope Process el cambio dura solo hasta cerrar la consola; sin él, queda guardado para su usuario. Asimismo, Microsoft desaconseja cambiar la configuración desde varias consolas a la vez, salvo con -Scope Process.
Autenticación sin intervención: entidades de servicio e identidades administradas
Un script programado no puede responder un código de verificación. Por eso, con la MFA obligatoria, Microsoft explica en su página sobre el impacto de la MFA en la automatización que cualquier automatización que inicie sesión con una cuenta de usuario «requiere actualización». Las alternativas son dos:
| Identidad | Qué es | Cuándo usarla |
|---|---|---|
| Identidad administrada | Una identidad ligada a un recurso de Azure; Azure guarda y rota sus credenciales | Scripts que corren dentro de Azure: una máquina virtual, Azure Automation, Functions |
| Entidad de servicio | Una aplicación registrada en Entra ID, con secreto o certificado | Scripts que corren fuera de Azure: un servidor de la oficina, un equipo de administración |
Así, dentro de Azure, iniciar sesión con la identidad del propio recurso no exige guardar nada:
Connect-AzAccount -Identity
En cambio, fuera de Azure lo recomendable es una entidad de servicio con certificado, instalado en el almacén del equipo que ejecuta el script:
$inquilino = '00000000-0000-0000-0000-000000000000'
$aplicacion = '11111111-1111-1111-1111-111111111111'
Connect-AzAccount -ServicePrincipal -ApplicationId $aplicacion -Tenant $inquilino -CertificateThumbprint 'A1B2C3D4E5F60718293A4B5C6D7E8F9012345678'
Qué rol recibe una entidad de servicio nueva
Aquí, sin embargo, la documentación de Microsoft se contradice. La guía para crear entidades de servicio dice, primero, que desde Az 7 New-AzADServicePrincipal ya no asigna el rol Colaborador y, unas líneas más abajo, que el rol predeterminado de una entidad con contraseña es Colaborador. La referencia del comando, por su parte, da el parámetro -Role sin valor predeterminado. Lo seguro es no suponer nada: asigne el rol mínimo de forma explícita y compruébelo después. Además, el secreto que crea el comando vence, de fábrica, al año.
$sp = New-AzADServicePrincipal -DisplayName 'kh-inventario-azure'
$ambito = '/subscriptions/' + (Get-AzContext).Subscription.Id
New-AzRoleAssignment -ApplicationId $sp.AppId -RoleDefinitionName 'Reader' -Scope $ambito
Get-AzRoleAssignment -ServicePrincipalName $sp.AppId | Select-Object RoleDefinitionName, Scope
Para un inventario basta Lector (Reader). Reserve Colaborador para lo que de verdad cambie recursos, y limítelo a un grupo de recursos cuando pueda.
Rendimiento: lo que tarda en cargar Azure PowerShell
Este fue el hallazgo más llamativo de la prueba. Para ello, con Az completo descargado, medimos cuánto tarda cada consola en cargar los módulos:
| Qué se cargó | PowerShell 7.6.9 | Windows PowerShell 5.1 |
|---|---|---|
Import-Module Az.Accounts | 4,4 s | 2,4 s |
Import-Module Az.Compute | 5,8 s | 1,0 s |
Import-Module Az (los 102 submódulos) | 552,7 s (9 min 13 s) | 338,5 s (5 min 39 s) |
| Comandos disponibles tras cargar Az | 7.210 | 7.210 |
| Memoria añadida a la consola | 1.596 MB | 1.577 MB |
Medimos una sola pasada por consola, así que tome las cifras como orden de magnitud. Además, la 5.1 mostró 16 avisos de verbos no aprobados al cargar submódulos como Az.Cdn. La conclusión práctica, en cualquier caso, es sencilla: no escriba Import-Module Az al principio de un script. No hace falta, porque PowerShell carga cada submódulo solo al usar su primer comando, y así un script que usa Get-AzVM carga Az.Accounts y Az.Compute en segundos. Si quiere dejarlo explícito, importe solo los submódulos que usa.
Escenarios de ejemplo
Los seis escenarios usan comandos de lectura, salvo donde se indica. Todos suponen que ya ejecutó Connect-AzAccount con una cuenta que tiene, como mínimo, el rol Lector.
1. Inventario de máquinas virtuales de todas las suscripciones
Recorre cada suscripción activa, lista las máquinas con su estado y lo guarda en un CSV que Excel abre bien en Colombia (punto y coma, y UTF-8 con BOM para las tildes):
$filas = foreach ($sub in Get-AzSubscription | Where-Object State -eq 'Enabled') {
Set-AzContext -Subscription $sub.Id | Out-Null
Get-AzVM -Status | Select-Object @{ n = 'Suscripcion'; e = { $sub.Name } }, ResourceGroupName, Name, Location, PowerState,
@{ n = 'Tamano'; e = { $_.HardwareProfile.VmSize } }, @{ n = 'SO'; e = { $_.StorageProfile.OsDisk.OsType } }
}
$filas | Export-Csv -Path '.\inventario-vm.csv' -NoTypeInformation -Delimiter ';' -Encoding utf8BOM
En Windows PowerShell 5.1, cambie utf8BOM por UTF8, que allí ya escribe el BOM.
2. Apagar por la noche las máquinas de prueba
Apaga y desasigna las máquinas encendidas que tienen la etiqueta apagado con el valor noche. Este sí cambia recursos, así que pruébelo primero con -WhatIf:
Get-AzVM -Status |
Where-Object { $_.Tags -and $_.Tags['apagado'] -eq 'noche' -and $_.PowerState -eq 'VM running' } |
ForEach-Object { Stop-AzVM -ResourceGroupName $_.ResourceGroupName -Name $_.Name -Force -WhatIf }
Quite -WhatIf cuando la lista sea la esperada. Si prefiere programarlo en un servidor de la oficina, siga nuestra guía de tareas programadas con PowerShell y use una entidad de servicio con certificado. Si lo programa dentro de Azure Automation, empiece el runbook con Connect-AzAccount -Identity y dé a esa identidad el rol Colaborador de máquinas virtuales solo sobre el grupo de recursos de pruebas.
3. Discos sin conectar y direcciones IP públicas sin uso
Por ejemplo, un disco que quedó suelto al borrar una máquina se sigue cobrando, y lo mismo pasa con una IP pública que no está asociada a nada:
Get-AzDisk | Where-Object DiskState -eq 'Unattached' |
Select-Object ResourceGroupName, Name, DiskSizeGB, @{ n = 'Sku'; e = { $_.Sku.Name } }, TimeCreated
Get-AzPublicIpAddress | Where-Object { -not $_.IpConfiguration } |
Select-Object ResourceGroupName, Name, IpAddress, @{ n = 'Sku'; e = { $_.Sku.Name } }
Aun así, revise la lista con quien conozca los proyectos antes de borrar nada: a veces un disco suelto es la única copia de algo. Además, una IP que usa una puerta de enlace NAT también aparece sin configuración IP, porque el objeto que devuelve el comando no trae esa relación; compruébelo en el portal antes de quitarla.
4. Recursos sin la etiqueta de centro de costo
Lista lo que no tiene la etiqueta centro-de-costo y luego la añade a un recurso sin tocar sus otras etiquetas (-Operation Merge):
$sinEtiqueta = Get-AzResource | Where-Object { -not $_.Tags -or -not $_.Tags.ContainsKey('centro-de-costo') }
$sinEtiqueta | Select-Object ResourceGroupName, Name, ResourceType | Sort-Object ResourceGroupName
Update-AzTag -ResourceId $sinEtiqueta[0].ResourceId -Tag @{ 'centro-de-costo' = 'TI' } -Operation Merge
Con -Operation Replace, en cambio, se borran las etiquetas que no estén en la lista. Según la referencia, un recurso admite hasta 50 etiquetas.
5. Quién es Propietario
El rol Propietario puede hacerlo todo, incluso dar permisos a otros. Conviene revisar esta lista cada cierto tiempo:
Get-AzRoleAssignment -RoleDefinitionName 'Owner' |
Select-Object DisplayName, SignInName, ObjectType, Scope | Sort-Object Scope
6. Cuántos recursos hay de cada tipo, en todas las suscripciones
Azure Resource Graph consulta todas las suscripciones de una vez, sin recorrerlas una por una. Recuerde el límite de 100 resultados que trae de fábrica:
$consulta = 'Resources | summarize recursos = count() by type | order by recursos desc'
Search-AzGraph -Query $consulta -First 1000
Actualizar y desinstalar Azure PowerShell
Microsoft publica una versión de Az casi cada mes: entre noviembre de 2025 y octubre de 2026 salieron 14 (de la 14.6.0 a la 16.4.0). Además, limita los cambios que rompen scripts a dos veces al año, y los anuncia con avisos en la consola. Para actualizar:
Update-PSResource -Name Az -Scope CurrentUser
O, si instaló con Install-Module:
Update-Module -Name Az -Force
Ojo: según Microsoft, Update-Module no borra las versiones anteriores. Con 620 MB por versión, tras tres actualizaciones sin limpiar quedan cuatro versiones, unos 2,5 GB en su perfil, y la carpeta Documentos de muchos equipos está dentro de OneDrive. Por eso, en la guía de módulos de PowerShell explicamos cómo ver y quitar las versiones viejas. Para desinstalar Az por completo, Microsoft solo da soporte a quitar todas las versiones a la vez, módulo por módulo.
Errores comunes de Azure PowerShell y cómo resolverlos
La mayoría de estos mensajes salen de la guía de solución de problemas de Microsoft; el segundo lo reprodujimos sin iniciar sesión.
| Mensaje o síntoma | Causa | Solución |
|---|---|---|
Get-AzVM no se reconoce como nombre de un cmdlet | El módulo no está instalado en esta consola | Instale Az o el submódulo; recuerde que 5.1 y 7 tienen carpetas distintas |
Run Connect-AzAccount to login. o, en Get-AzVM, No subscription found in the context. | No hay sesión iniciada en esta consola | Ejecute Connect-AzAccount |
Could not find tenant id for provided tenant domain | Inquilino mal escrito o entidad de servicio que no existe en él | Revise el identificador del inquilino y de la aplicación |
The 'Connect-AzAccount' command was found in the module 'Az.Accounts', but the module could not be loaded. | AzureRM y Az en la misma consola | Desinstale AzureRM; si lo necesita, solo en 5.1 para su usuario, y Az en PowerShell 7 |
UsernamePasswordCredential authentication failed | Script con usuario y contraseña ante la MFA obligatoria | Identidad administrada o entidad de servicio |
Users must authenticate with multi-factor authentication to create or update resources. | Sesión sin MFA intentando un cambio | Connect-AzAccount con -ClaimsChallenge, o pedir que la MFA se exija al iniciar sesión |
Unable to acquire token for tenant… | Varios inquilinos, uno con MFA | Connect-AzAccount con -TenantId |
User canceled authentication o la ventana no aparece | Limitaciones de WAM (por ejemplo, en Windows PowerShell ISE) | Update-AzConfig -EnableLoginByWam $false o -UseDeviceAuthentication |
Object reference not set to an instance of an object | El recurso no existe o no tiene permiso sobre él | Compruébelo con Get-AzResource -ResourceId |
| El comando trabaja en la suscripción equivocada | Contexto guardado de una sesión anterior | Get-AzContext antes de cambiar nada |
| La carga de Az tarda minutos | Import-Module Az en el script | Deje la carga automática o importe solo los submódulos |
Recomendaciones
- Use PowerShell 7 y PSResourceGet: la descarga tardó un 38 % menos que con el motor de
Install-Module. - Instale solo los submódulos que usa en los equipos de trabajo, y Az completo solo donde haga falta.
- No escriba
Import-Module Azen los scripts. - Mire el contexto antes de cambiar nada:
Get-AzContextcuesta un segundo y evita borrar en la suscripción equivocada. - Pruebe con
-WhatIftodo lo que modifique o borre. - Nada de usuario y contraseña en los scripts: identidad administrada dentro de Azure y entidad de servicio con certificado fuera.
- Asigne el rol mínimo y compruébelo con
Get-AzRoleAssignment; no dé por hecho qué rol trae una entidad de servicio. - Actualice cada pocos meses y limpie las versiones viejas, y lea los avisos de cambios antes de cada versión mayor.
- Use
-Scope Processen equipos compartidos, para no dejar sesiones guardadas.
Lo que medimos y lo que no
Medimos en un Windows 11 sin permisos de administrador, con Windows PowerShell 5.1.26100 y PowerShell 7.6.9: la versión y las dependencias que publicaba la Galería, la descarga con los dos gestores, el contenido de los 103 manifiestos, los tiempos de carga, la configuración de fábrica, los mensajes sin sesión iniciada y los parámetros y propiedades de cada comando del artículo, comprobados contra Az 16.4.0 en las dos consolas. Lo descargado se borró al terminar y el equipo quedó como estaba.
En cambio, no iniciamos sesión en ninguna suscripción de Azure: los resultados de los escenarios y los mensajes con MFA son los que publica Microsoft. Tampoco probamos Cloud Shell, el instalador MSI, Linux ni macOS.
Preguntas frecuentes
¿Azure PowerShell es gratis?
Sí. El módulo es gratuito y de código abierto. Lo que sí se paga, en cambio, son los recursos de Azure que crea o usa, y en Cloud Shell, el almacenamiento de sus archivos.
¿Sirve Azure PowerShell para administrar usuarios de Microsoft 365?
No es su función. Az trae algunos comandos de Entra ID, pero para usuarios, licencias y grupos de Microsoft 365 la herramienta de Microsoft es Microsoft Graph PowerShell.
¿Puedo seguir usando AzureRM?
Puede instalarse, pero Microsoft lo retiró el 29 de febrero de 2024 y no le da soporte. Además, no convive con Az en la misma consola de Windows PowerShell 5.1. Lo recomendable es migrar los scripts. Microsoft ofrece una herramienta que los actualiza de forma automática y, mientras tanto, un modo de compatibilidad con Enable-AzureRmAlias, que hace que los nombres antiguos funcionen sobre Az.
¿Necesito permisos de administrador para instalar Azure PowerShell?
No. Con -Scope CurrentUser se instala en su perfil, y así lo probamos. En cambio, solo hace falta elevar para instalarlo para todos los usuarios o con el MSI.
¿Por qué Connect-AzAccount no abre el navegador?
Porque desde Az 12.0.0 usa el inicio de sesión de Windows (WAM). Si prefiere el navegador, desactívelo con Update-AzConfig -EnableLoginByWam $false.
Azure PowerShell en la empresa
Ejecutar unos comandos es fácil. Lo difícil, en cambio, es que las suscripciones tengan dueño, que los permisos sigan el mínimo necesario, que los scripts no dependan de la cuenta de alguien que ya se fue y que nadie pague discos olvidados. En KHARONTE hacemos ese trabajo dentro de nuestros servicios administrados de Azure: suscripciones, consumo, infraestructura y Entra ID, atendidos desde nuestra mesa de ayuda TI y como parte de los servicios administrados de TI que prestamos. Si quiere conocer el resto de nuestros servicios de TI para empresas, escríbanos.




