Reinstal·lar un Windows remotament amb un sol servidor d’arxius

Normalment per tenir totes les màquines estandaritzades es crea una imatge base del sistema, que un cop aplicada, arrenca i executa uns scripts de configuració posterior. Aquesta és la base de qualsevol sistema de desplegament d’imatges de SO, sigui Microsoft Deployment Toolkit, Ghost Solution Suite o Acronis Snap Deploy. Fins ara el MS era el SMS i la seva solució més potent és la System Center Configuration Management. Crec que en Software privatiu sempre és millor usar les eines que ofereix el propi desenvolupador, per alguna cosa es queda el codi font. La resta de solucions han estat desfasades a favor de les de Microsoft.

WinPE 3.0 (based on Windows 7) running the she...

WinPE 3.0 (basat en Windows 7) corrent una shell cmd i diversos programes buit-in. (Photo credit: Wikipedia)

Tot i aquestes solucions, podem crear una solució pròpia i feta per nosaltres (DIY es el que ens mola) molt més adaptativa i simple. Això vol dir escriure molt i pensar, cosa que a la majoria de sysadmins de Windows no els agrada🙂 Però tampoc cal reinventar la roda no? Podem aglutinar eines existents que ens permetin complir aquest objectiu.
Abans de començar a crear un servidor de WDS amb MDT, vaig escriure una sèrie d’scripts i imatges de Windows que permet desplegar una instal·lació amb tant sols un servidor de disc de SMB/CIFS (p. e. Samba o Windows Server).

A més aquesta solució ens permet executar-se com un script remot (p.e. amb psexec.exe) o un script d’inici de màquina (fins i tot podriem mirar si la màquina forma part de la llista d’equips a migrar; em ballen moltes idees).

Les eines usades són:

  • Evidentment un editor de text de veritat, no el notepad.exe.
  • Windows ADK. Inclou el WinPE i eines per modificar-lo.
  • Servidor de fitxers.
  • Eines de control remot, sigui RDP, VNC…

No penso explicar com es genera la imatge WIM genèrica per implementar el Windows. Toca estudiar la documentació de technet i les guies dels seus gurus🙂 Està suficientment ben explicat com per no repetir-me (DRY!).
Intentaré cobrir-ho en un altre entrada, juntament on hi explicaré com usar el MDT.

Els passos d’aquests scripts són simples:

  1. SCRIPT Modificació del boot de la màquina local a BCD de NT 6.x.
    Això ens permet entrar en el WinPE sense un arranc PXE, usant el WIM modificat del WinPE.

    @echo off
    Set RutaRUN=%~dp0
    REM Backup de la conf del BCD
    xcopy C:\BOOT\BCD C:\BOOT\BCD.BCK
    REM Copiem els arxius de BOOT a local
    xcopy "%rutaRUN%\WINPE\BOOTMGR" c:\
    xcopy "%rutaRUN%\WINPE\SOURCES" c:\SOURCES /S /I /Y
    xcopy "%rutaRUN%\WINPE\BOOT" c:\BOOT /S /I /Y
    IF EXIST c:\SOURCES\BOOT.WIM "%rutaRUN%\bootsect.exe" /nt60 c:
    ELSE EXIT 1
    IF EXIST c:\SOURCES\BOOT.WIM "%rutaRUN%\shutdown.exe" -r -t 5 -c "REINSTALL PC"
    ELSE EXIT 1

    És ben simple: Copiem els arxius de boot i modifiquem el boot del BCD a un bootsector de NT 6.0.

  2. Si hem configurat correctament el BCD segons la plantilla adjunta a aquesta entrada, tindrem un arranc cap a WinPE. En cas d’error tornarà a carregar (per disseny del BCD) el Windows que hi hagi al HDD.
    En aquest punt carregarà l’script que trobi a x:\WINDOWS\system32\startnet.cmd. Aquest és el fitxer principal. El més recomenable és incloure-hi un bucle de ping a l’espera de trobar el servidor de fitxers i cridar un script conegut en aquest servidor. Així ens evitem tocar més la imatge WIM😉 Podria ser com el següent:

    @echo off
    wpeinit
    wpeutil DisableFirewall >NUL
    REM http://technet.microsoft.com/en-us/library/cc960646.aspx
    reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v LmCompatibilityLevel \
     /t REG_DWORD /d 1 /f >NUL
    SET SERVER_DEPLOYMENT= SERVER
    :NETWORK
    REM Comprovem que tenim ping al servidor especificat i saltem a START.
    REM Si no saltem a NONETWORK.
    SET COUNTER=2
    IF %COUNTER% == 0 GOTO NONETWORK
    ipconfig /renew >NUL
    SET /A COUNTER -=1
    ping %SERVER_DEPLOYMENT% | find "TTL=" >NUL
    IF %ERRORLEVEL% == 0 goto START
    IF NOT %ERRORLEVEL% == 0 echo esperant connexio... && x:\sleep 5 && goto NETWORK
    
    :START
    CALL \\%SERVER_DEPLOYMENT%\%SHARE%\SCRIPTS\WINPE_START.CMD:NONETWORK
    XCOPY C:\BOOTMGR.MGR C:\BOOTMGR /I /Y
    WPEUTIL REBOOT
  3. Ara l’important és pensar què ha de fer l’script. Tenim xarxa. Però hem d’assegurar-nos de:
    • l’accés al HDD, i que la partició està correctament formatejada (després d’un possible backup)
    • comprovar que la C: és la unitat de sistema (el WinPE ens ho detecta però no ens podem fiar, és Microsoft :)),
    • si volem fer un backup. El podem fer en WIM, però la imatge no serveix per restaurar.
    • Modificar el unnatended.xml i/o sysprep.inf, per incloure el nom de màquina correcte o altres paràmetres que s’inclouen en el .
    • Altres operacions abans d’entrar al S.O. instal·lat.

Un exemple de les coses que podem fer en aquest script seria:

@echo off

:lletres
echo Comprovant lletres unitats ...
x:
wmic logicaldisk get caption,volumename | find "LOCALDISK" > tmpC.txt
set /p lletraC="" < tmpC.txt
set lletraC=%lletraC:~0,1%

if not exist c:\WINDOWS set BOOLWINDOWS="NO" && goto nowindows

:ID
ECHO Llegint nom equip...
reg load HKLM\SYSTEM_OLD c:\windows\system32\config\SYSTEM
for /f "tokens=3*" %%A in ('reg query HKEY_LOCAL_MACHINE\SYSTEM:OLD\ControlSet001\Control\ComputerName\ComputerName /v ComputerName') do set real_hostname=%%A
reg unload HKLM\SYSTEM_OLD

:BACKUP
imagex /capture C:\ %SERVER_BACKUP%\%SHARE%\%REAL_HOSTNAME%.WIM "BACKUP C"

:RMHOST
x:\dsrm.exe -noprompt (-help)
:MAQUETAR
diskpart /s x:\diskpart-migracio.txt
x:\imagex\imagex.exe /APPLY %imagepath%\IMATGE.WIM 1 C: | CALL :ERROR
REM Modifiquem hostname real a la plantilla sysprep de WinXP.
x:\sed.exe s/nomequipfinal/%equip%/ c:\sysprep\sysprep.inf > "c:\sysprep\sysprep2.inf" && move /Y c:\sysprep\sysprep2.inf c:\sysprep\sysprep.inf

WPEUTIL REBOOT

:ERROR
PAUSE
WPEUTIL REBOOT

Ara ja tenim un S.O. nou arrancable. Si hem creat bé la imatge preparada, entrarà en la segona fase (online post-install) i ja forma part del procediment habitual de la implentació de Microsoft del Windows.🙂


About this entry