Convertir un disque virtuel VMDK en image Ghost GHO

Quand vous etes en milieu professionnel, vous devez certainement faire des déploiements d'une installation d'une machine sur plusieurs dizaines ou centaines d'autre pour avoir la même installation. Ici on va utiliser Altiris Ghost (anciennement nommé Symantec Ghost). Pour avoir l'image (master) de la machine à déployer soit on travaille avec une machine physique soit avec une machine virtuelle. Cette dernière solution est de loin la plus simple et flexible, car on peut faire des snapshots pour faire plusieurs tests de configuration ou installation de logiciel sans limite avec un gain de temps incomparable!!! Il existe plusieurs solutions de virtualisation, mais les plus utilisées sont Virtualbox et VMware (oui il y a Parallels, Qemu, HyperV,…). Perso j'utilise VirtualBox, car multi-plateforme et gratuit.

On peut certes faire une image comme avec une machine physique (PXE, Automation Folder) mais le plus simple est de transformer/convertir directement le disque virtuel en image. L'utilitaire ghost32.exe ou ghost64.exe de Ghost Standard Tools permet de le faire à partir des disques virtuel VMDK. Vous devez donc pensez à choirsir ce type de disque lors de la création de votre machine virtuelle. Sinon il faudra convertir votre disque. Avec VirtualBox il y a les commande pour cela. Ce nouveau script gere le clonage temporaire des disques VDI en VMDK.

Voici donc le script, à adapter selon vos besoins

convertVMDKtoGHO.bat

@echo off
cls
chcp 65001> nul
chcp 850> nul

REM
REM Script de conversion de disque virtuel VMDK en image ghost GHO
REM
REM by O.brizard (a.k.a beemoon.fr)
REM @2025
REM

TITLE Convert VirtualBox VMDK to Ghost image GHO
SETLOCAL EnableDelayedExpansion

REM Check Ghost Tools
If "%PROCESSOR_ARCHITECTURE%"=="AMD64" set arch=64
If "%PROCESSOR_ARCHITECTURE%"=="x86" set arch=32
if not exist "C:\Program Files (x86)\Symantec\Ghost\ghost%arch%.exe" (
    echo Ghost Tools n'est pas install‚ sur cette machine.
    echo   - installez d'abord Symantec_Ghost_Standard_Tools
    echo   - ou d‚placez le r‚pertoire dans "C:\Program Files (x86)\Symantec"
    echo.
    pause
    exit
)
pushd "C:\Program Files\Oracle\VirtualBox"

rem **** EXTRA pour Virtualbox ****
    rem https://www.virtualbox.org/manual/ch08.html

REM **** Paramètes pour automatiser (Optionnel) ****

    set VMtoClone=""

REM **** Fin Paramètres ****

:listVMs
    echo.
    echo Nom des VMs disponibles :
    VBoxManage.exe list vms> %TMP%\tmp.txt
    VBoxManage.exe list vms
    echo.
    set VMtoClone=""
    for /f %%i in ("%TMP%\tmp.txt") do set size=%%~zi
    if %size% leq 0 (
        echo Il n'y a pas de VM disponibles
        echo.
        pause
        goto :eof
        )

:choixVM
if %VMtoClone%=="" (
    set /p VMtoClone=Nom de la VM qui est entre double quote … convertir en GHO:
)
if %VMtoClone%=="" goto :listVMs
FOR /F %%a IN ('findstr /i /c:"%VMtoClone%" %TMP%\tmp.txt^|find /C """%VMtoClone%"""') do set nbFind=%%a

if not %nbFind%==1 (
    echo.
    echo La VM "%VMtoClone%" n'existe pas.
    goto :listVMs
)

:_start
del /Q %TMP%\tmp.txt

REM Info sur la VM originale
VBoxManage.exe showvminfo %VMtoClone% --machinereadable>%TMP%\showvminfo.txt
for /f "tokens=*" %%a in (%TMP%\showvminfo.txt) do (
    set z=%%a
    set z=!z:"=!
    set z=!z:\\=\!
    set "!z!" 2>nul
    REM echo !z!
)
REM nettoyage des infos
del /Q %TMP%\showvminfo.txt> nul

REM https://beemoon.fr/doku.php?id=systeme:windows:expandfilename
for /f "delims=" %%i in ("%SATA-0-0%") do set disqueType=%%~xi
for /f "delims=" %%i in ("%CfgFile%") do set VMsFolder=%%~dpi
set VMsFolder=%VMsFolder:~0,-1%
for /f "delims=" %%i in ("%ostype%") do set osType=%%i
set osType=%osType:~0,7%

set newVM=master_%VMtoClone%
set /p "newVMTmp=Nomage du GHO [ %newVM% ] :"
if NOT "%newVMTmp%"=="" (set newVM=%newVMTmp%)

if exist "%VMsFolder%" (
    VBoxManage.exe unregistervm %newVM% --delete>nul 2>&1
    if %errorlevel% EQU 1 (
    rd /Q /S "%VMsFolder%"
    set errorlevel=0
    )
)

echo.
echo Merge des snapshots par clone de la machine r‚f‚rente %VMtoClone%
VBoxManage.exe clonevm %VMtoClone% --mode machine --name %newVM% --register

REM Info sur la nouvelle VM
VBoxManage.exe showvminfo %newVM% --machinereadable>%TMP%\showvminfo.txt
for /f "tokens=*" %%b in (%TMP%\showvminfo.txt) do (
    set z=%%b
    set z=!z:"=!
    set z=!z:\\=\!
    set "!z!" 2>nul
)
REM nettoyage des infos
del /Q %TMP%\showvminfo.txt> nul

REM https://beemoon.fr/doku.php?id=systeme:windows:expandfilename
for /f "delims=" %%i in ("%SATA-0-0%") do set disqueType=%%~xi
for /f "delims=" %%i in ("%CfgFile%") do set VMsFolder=%%~dpi
set VMsFolder=%VMsFolder:~0,-1%
for /f "delims=" %%i in ("%ostype%") do set osType=%%i
set osType=%osType:~0,7%

if NOT "%disqueType%"==".vmdk" (
    if "%disqueType%"==".vdi" (
    echo.
    echo Conversion du disque VDI en format VMDK pour le clonage avec Ghost.
        VBoxManage.exe clonemedium "%SATA-0-0%" "%SATA-0-0:~0,-4%.vmdk" --format=VMDK
    ) else (
    echo Seuls les disques virtuels VMDK et VDI sont pris en charge
    echo.
    pause
    goto :eof
    )
)

REM Création du dossier de stockage de la capture GHO.
if not exist "%USERPROFILE%\Desktop\%newVM%" mkdir "%USERPROFILE%\Desktop\%newVM%"

rem https://www.symantec.com/connect/articles/converting-image-file-format-gho-vmdk-and-vmdk-gho
set _src="%SATA-0-0:~0,-4%.vmdk"
REM Pour VM linux
    set ghostParams=-clone,mode=create,src=%_src%,dst="%USERPROFILE%\Desktop\%newVM%\%newVM%.gho" -batch -sure -split=2048 -Z -id -ntil -ntic
REM Pour VM Windows
FOR /F "tokens=*" %%a IN ('echo %osType%^|find /C "Windows"') do set isWindows=%%a
if %isWindows%==1 (
    set ghostParams=-clone,mode=create,src=%_src%,dst="%USERPROFILE%\Desktop\%newVM%\%newVM%.gho" -batch -sure -split=2048 -Z
)
echo.
echo D‚marrage de la capture en GHO avec Ghost...
"C:\Program Files (x86)\Symantec\Ghost\ghost%arch%.exe" %ghostParams%

rem Suppresion du clone Virtualbox
if exist "%VMsFolder%" (
    if exist "%SATA-0-0:~0,-4%.vdi" (
        echo.
        echo Suppression du VMDK temporaire
        VBoxManage.exe closemedium disk "%SATA-0-0:~0,-4%.vmdk" --delete
    )
echo.
echo Suppression du clone temporaire.
VBoxManage.exe unregistervm %newVM% --delete
    if %errorlevel% EQU 1 (
    rd /Q /S "%VMsFolder%"
    )
)

:end
echo.
echo ===================================================================
echo Stockage de la capture GHO dans "%USERPROFILE%\Desktop\%newVM%"
echo ===================================================================
echo.
echo *** Termin‚ ***
echo.
REM Pour déplacer la capture
REM move "%USERPROFILE%\Desktop\%newVM%" c:\>nul
pause