Contents

Ejecutar script de PowerShell después de Sysprep

Recuerdo que uno de mis primeros casos de uso de PowerShell, que además hizo que empezara a profundizar en él, fue personalizar plantillas de sistemas operativos Windows recién desplegados. Si bien los distintos hipervisores ofrecen opciones de este tipo, ejecutar un script de PowerShell después de Sysprep es una solución que funcionará a través de cualquier hipervisor que utilicemos. En la entrada de hoy veremos cómo programar dicha ejecución y que no se destruya después del Sysprep.

¿Qué es Sysprep?

Si has llegado hasta aquí lo más probable es que sepas de sobras lo que es Sysprep, pero nunca está de más aclararlo. Sysprep es una utilidad de los sistemas operativos Windows que podemos encontrar en C:\Windows\System32\Sysprep con la que podemos preparar nuestras plantillas para poder ser desplegadas una y otra vez en un mismo entorno.

Básicamente lo que hace Sysprep es generalizar un sistema operativo quitándole los identificadores únicos al mismo, permitiendo así ser desplegado múltiples veces sin peligro de IDs duplicados.

/wp-content/uploads/2018/10/Sysprep.png
Script de PowerShell después de Sysprep

¿Por qué ejecutar un script de PowerShell después de Sysprep?

Habitualmente lo que se hace con una plantilla de Windows es actualizar el sistema operativo, realizar las configuraciones oportunas en el sistema e instalar las aplicaciones que necesitemos. El problema es que después de generalizar una instalación con Sysprep las configuraciones del sistema pueden desaparecer, además de que hay otras que es posible que no podamos incluir en la plantilla o que sean variables según el rol del sistema a desplegar.

Ejecutar un script de PowerShell después de Sysprep nos va a permitir que justo después de hacer el primer login podamos personalizar todo lo que se nos ocurra del propio sistema.

¿Cómo ejecutar un script después de Sysprep?

Para programar la ejecución de un programa una sola vez después de iniciar el sistema es habitual utilizar la clave de registro: HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce, pero como decía en el apartado anterior, muchas configuraciones se pierden al realizar Sysprep y ésta es una de ellas. Para saltarnos esta limitación podemos tirar del script SetupComplete.cmd.

SetupComplete.cmd es un script que podemos crear en C:\Windows\Setup\Scripts, que se ejecutará justo después del setup del sistema operativo. Si tenemos la suerte de que nuestra personalización puede correr desde un archivo .cmd podemos aplicar las configuraciones en dicho archivo, pero para usar un script de PowerShell deberemos tirar de la entrada de registro anteriormente mencionada. Éste sería el contenido de nuestro archivo SetupComplete.cmd:

1
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /v "PostDeploy" /d "C:\Windows\System32\WindowsPowerShell\v1.0\powershell -executionpolicy unrestricted -file C:\Scripts\Post-deploy.ps1" /t REG_SZ

Como siempre vamos a desglosar la línea, que ha quedado larguita:

  • REG ADD “HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce: Añadimos una entrada de registro nueva en la ruta especificada.
  • /v “PostDeploy”: Especificamos el nombre de la entrada.
  • /d: Especificamos el contenido de la entrada de registro.
  • C:\Windows\System32\WindowsPowerShell\v1.0\powershell: Ejecutamos PowerShell.
  • -executionpolicy unrestricted: Establecemos la Execution Policy de la consola que abriremos a unrestricted para que no nos limite la ejecución de scripts.
  • -file C:\Scripts\Post-deploy.ps1: Establecemos la ruta completa del script de PowerShell que contiene nuestras personalizaciones.
  • /t REG_SZ: Establecemos el tipo de entrada de registro.

¿Qué podemos añadir en nuestro script de PowerShell después de Sysprep?

Básicamente podemos ejecutar cualquier cosa que se nos ocurra en nuestro scripts, pero si andas corto de ideas aquí van unas cuantas:

Y la lista podría seguir hasta el infinito según cada caso de uso.

Espero que el contenido de esta entrada os ayude a arañar unas cuantas horas al reloj gracias a la automatización. :-)