Delete-BackupVault.ps1: el script que ojalá hubiera tenido antes

Si alguna vez has intentado eliminar un Recovery Services Vault en Azure a mano, sabes exactamente de qué va este post. Entras al portal con toda la confianza del mundo, le das a «Eliminar vault»… y Azure te dice que no. Que hay elementos de backup activos. Vale, los eliminas. Que hay servidores MAB registrados. Los das de baja. Que el Soft Delete sigue activo. Lo desactivas. Que hay elementos en estado «pendiente de borrado». Los restauras para poder borrarlos. Que…

En algún punto de ese proceso —habitualmente el cuarto o quinto intento— uno piensa que tiene que haber una forma mejor.

Este script es esa forma mejor.


Qué hace (en dos frases)

Delete-BackupVault.ps1 es un script de PowerShell que elimina completamente un Recovery Services Vault de Azure, incluyendo todos sus datos de backup, contenedores registrados, agentes MARS/MABS/DPM y configuración de ASR. Lo hace de forma interactiva: te pide el tenant, la suscripción y el vault —sin hardcodear nada— y al final te pide confirmación antes de hacer cualquier cosa destructiva.


Antes de empezar: requisitos

Solo necesitas dos cosas instaladas en tu máquina:

  • PowerShell 7 o superior — si tienes la versión incluida con Windows (la 5.1), actualiza antes de seguir. Descarga en aka.ms/powershell.
  • Módulos Az de Azure — el script los instala y actualiza automáticamente si detecta que no están o están desactualizados. Nada que hacer aquí.

En cuanto a permisos, la cuenta con la que te autentiques necesita tener el rol Contributor o Backup Contributor sobre el vault (o la suscripción). Sin ese rol, el script lo detecta y te explica exactamente dónde asignarlo, pero no podrá continuar.


Cómo usarlo

1. Descarga el script

Guárdalo en una carpeta local de tu equipo. Importante: no lo ejecutes desde una unidad de red (ruta UNC tipo \\servidor\carpeta\), ya que PowerShell aplica restricciones adicionales en ese contexto.

2. Abre PowerShell 7

Puedes encontrarlo en el menú de inicio como «PowerShell 7» o ejecutar pwsh desde cualquier terminal. Navega a la carpeta donde guardaste el script:

cd C:\Scripts

3. Ejecuta el script

.\Delete_BackupVault.ps1

Lo primero que verás es el aviso de ATENCIÓN en rojo. No está de adorno: este script hace cosas irreversibles, así que vale la pena recordarlo en cada ejecución.

azure_ps_delete_backups_01 sobre azure_ps_delete_vault

4. Primer login: autenticación genérica

El script te pedirá que abras https://login.microsoft.com/device en un navegador e introduzcas el código que aparece en consola. Este primer login es sin tenant específico —su único propósito es poder listar los tenants a los que tienes acceso.

[Login to Azure] To sign in, use a web browser to open the page
https://login.microsoft.com/device and enter the code ABCD1234

5. Selecciona el tenant

Una vez autenticado, el script muestra todos los tenants disponibles con su nombre, dominio e ID:

Tenants disponibles:
  [1] Empresa Ejemplo  |  empresa.com  |  ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  [2] Otro Tenant      |  otro.com     |  ID: yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy

Introduce el número correspondiente.

azure_ps_delete_backups_02 sobre azure_ps_delete_vault

6. Segundo login: autenticación en el tenant elegido

Si el tenant tiene MFA o políticas de Acceso Condicional, Azure requerirá un segundo login específico para ese tenant. Es el comportamiento esperado y correcto. Repite el proceso del código en el navegador.

7. Selecciona la suscripción

Suscripciones disponibles:
  [1] Mi Suscripcion Azure  |  ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

8. Selecciona el vault

El script lista todos los Recovery Services Vaults de esa suscripción:

Vaults disponibles:
  [1] BackupGeneral  |  Resource Group: rg-produccion  |  Region: westeurope
  [2] BackupTest     |  Resource Group: rg-desarrollo   |  Region: northeurope

9. Confirma antes de proceder

El script muestra un resumen completo de lo que va a borrar y espera que escribas SI (en mayúsculas) para continuar. Cualquier otra cosa cancela la operación sin tocar nada.

==================================================
  ATENCION: OPERACION DESTRUCTIVA E IRREVERSIBLE
==================================================
  Tenant      : Empresa Ejemplo (empresa.com)
  Tenant ID   : xxxxxxxx-...
  Suscripcion : Mi Suscripcion Azure
  Sub ID      : xxxxxxxx-...
  Vault       : BackupGeneral
  Grupo       : rg-produccion
==================================================

Escribe 'SI' para confirmar y continuar, cualquier otra cosa cancela:

azure_ps_delete_backups_04 sobre azure_ps_delete_vault

10. El script trabaja solo

A partir de aquí el proceso es automático. El script va informando de cada paso: desactiva Soft Delete y Enhanced Security, elimina los items de backup por tipo (VM, SQL, SAP HANA, Azure Files), da de baja los contenedores MARS/MAB/DPM, limpia configuración ASR y Private Endpoints, y por último borra el vault vía REST API.

Si al finalizar la limpieza detecta elementos que no pudo eliminar (por ejemplo, por permisos insuficientes), te avisa antes de intentar el borrado del vault y te pregunta si quieres continuar de todas formas o cancelar.


Lo que me costó más trabajo (y por qué el script es así)

Este script no salió a la primera. Hubo varios problemas que llevaron más tiempo del esperado.

El primero fue la autenticación en entornos multi-tenant. Si tienes varias cuentas de Azure cacheadas, el módulo Az intentaba usar credenciales del token cache de WAM y fallaba con errores de SharedTokenCacheCredential. La solución fue desactivar WAM completamente (Update-AzConfig -EnableLoginByWam $false), usar -Scope Process para que todo quede en memoria sin afectar otras sesiones, y forzar la autenticación por código de dispositivo.

El segundo fue el problema del «MAB server BadRequest». Cuando un vault tiene un agente MARS con elementos en estado soft-deleted, Azure rechaza cualquier intento de dar de baja el servidor hasta que restauras esos elementos, los eliminas definitivamente y después desactivas Enhanced Security. El orden importa, y la documentación oficial no lo deja muy claro.

El tercero, más reciente: Get-AzRecoveryServicesVault devolvía vacío en algunos entornos aunque el vault existía y los permisos eran correctos. Resulta que el módulo Az.RecoveryServices a veces no respeta el contexto de -Scope Process cuando hay múltiples contextos cargados. La solución fue usar -DefaultProfile $context explícitamente y añadir un fallback que consulta la REST API de ARM directamente para listar vaults sin depender del módulo.


Errores con buena pinta

En lugar de escupir el JSON crudo del error de Azure (que es lo habitual), el script detecta el tipo de error y lo formatea:

Para errores de permisos (AuthorizationFailed), en lugar de esto:

{"error":{"code":"AuthorizationFailed","message":"The client '[email protected]' with object id '...' does not have authorization..."}}

Muestra esto:

  +--------------------------------------------------------------------------+
  | PERMISOS INSUFICIENTES                                                   |
  |--------------------------------------------------------------------------|
  | Cuenta  : [email protected]                                                 |
  | Accion  : Microsoft.RecoveryServices/vaults/read                         |
  | Recurso : /subscriptions/957f03b7-...                                    |
  |--------------------------------------------------------------------------|
  | SOLUCION:                                                                |
  | Azure Portal > Recurso > Control de acceso (IAM)                        |
  | > Agregar asignacion de rol                                              |
  | > Rol: Contributor o Backup Contributor                                  |
  | > Cuenta: [email protected]                                                 |
  +--------------------------------------------------------------------------+

Son pequeñas cosas, pero cuando estás a las 11 de la noche intentando liberar recursos de un cliente, se agradece.

azure_ps_delete_backups_03 sobre azure_ps_delete_vault

Descarga

El script está disponible para descarga directa. Solo necesitas guardarlo y ejecutarlo con PowerShell 7 tal como se describe arriba.

Recuerda: este script elimina datos de forma permanente. Úsalo solo cuando estés completamente seguro de que el vault y todos sus backups son prescindibles. No hay vuelta atrás.


¿Preguntas o mejoras?

Si lo pruebas y encuentras algún caso que no esté cubierto, o tienes un entorno con alguna configuración especial (DPM, CMK, Private Link, etc.), escríbeme. El script ha pasado por bastantes iteraciones reales y cada error nuevo encontrado ha acabado en una mejora.

Descargar script en powershell de Github

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.