Hyper-V Virtuelle Maschine per Script erstellen; mein Lösungsansatz

Deine Frage passt nicht in die anderen Bereiche, dann stelle sie hier.
Benutzeravatar
Holgi
Meister
Meister
Beiträge: 358
Registriert: 12.05.2018, 12:33
Geschlecht:

Re: Hyper-V Virtuelle Maschine per Script erstellen; mein Lösungsansatz

Beitrag von Holgi » 26.03.2021, 20:14

ich habe jetzt mit dem Script von ct mal ein wenig rumgespielt. Funktioniert grds. gut.
Es ist zu beachten, dass zunächst eine Verknüpfung zum Script (*.cmd) hergestellt werden sollte/muss. Diese Verknüpfung dann mit Admin-Rechten ausstatten. Dann einfach z.B. die ISO auf die Verlinkung ziehen und schon geht es los. :)
Was mich stört:
ich habe mit einer Server vNExt Standard (Desktopdarstellung) experimentiert. Da wird der Dateiname der vhdx ellenlang und auch noch abgeschnitten. Darüberhinaus landet die vhdx nicht in meinem Standardverzeichnis für die Virtual Hard Disks (C:\Users\Public\Documents\Hyper-V\Virtual hard disks), sondern in "C:\ProgramData\Microsoft\Windows\Hyper-V\Windows_Server_2022_Standard_(Desktopdars_x64_de-DE_Gen2_10.0.20317"
Ich sag ja: viel zu lang!
Weiß jemand, wie man das ändern kann?
Noch ein Verbesserungvorschlag von mir zu dem ct-Script:
Die VM nicht nur starten, sondern auch gleich verbinden und bei den Integrationsdiensten auch gleich die Gastdienste mit integrieren:
english: Guest Service Interface
deutsch: Gastdienstschnittstelle

Code: Alles auswählen

set operation=*** Temporaere Laufwerke wieder aushaengen ***
echo %weiss%%operation%%gruen%
echo.
if exist %workdir%%folder% rd /q /s %workdir%%folder%
if not %efilw%.==. if not %vhdlw%.==. if not %efilw%.==%vhdlw%. mountvol %efilw%: /d >nul 2>nul
if exist %vhdlw%: powershell dismount-vhd -path '%vmpfad%%vmname%\%vmname%.%format%'
if exist %isolw%: powershell "dismount-diskimage '%iso%'"

powershell Enable-VMIntegrationService -VMName '%vmname%' -Name 'Gastdienstschnittstelle'

set operation=*** Starte VM ***
echo %weiss%%operation%%gruen%
echo.
powershell Start-VM -name '%vmname%'
powershell vmconnect $env:COMPUTERNAME '%vmname%'
echo %weiss%*** Fertig! ***
echo.

Tante Google

Re: Hyper-V Virtuelle Maschine per Script erstellen; mein Lösungsansatz

Beitrag von Tante Google » 26.03.2021, 20:14


ecerer

Re: Hyper-V Virtuelle Maschine per Script erstellen; mein Lösungsansatz

Beitrag von ecerer » 27.03.2021, 12:39

Naja im Prinzip weißt du doch wie es geht. Selbst ist die Frau.
Das mit ISO auf … ziehen wollte ich dir auch für deine .msu Kürzung empfehlen.

Hier kann man doch einfach was weg löschen...
Zeile x: if "%vmpfad%."=="." set vmpfad=%allusersprofile%\Microsoft\Windows\Hyper-V\
Zeile y: echo create vdisk file=%vmpfad%%vmname%\%vmname%.%format% maximum=%vhdsize% type=%typ% > %workdir%%folder%\diskpart.txt

Benutzeravatar
Holgi
Meister
Meister
Beiträge: 358
Registriert: 12.05.2018, 12:33
Geschlecht:

Re: Hyper-V Virtuelle Maschine per Script erstellen; mein Lösungsansatz

Beitrag von Holgi » 27.03.2021, 16:33

Naja im Prinzip weißt du doch wie es geht.
Aber eben nur im Prinzip.
Ich bin jetzt soweit:
den Namen der VM habe ich in den Variablen des Scripts festgelegt > läuft!
Aber:
beim Verzeichnis für die VM gibt es Probleme. Liegt wohl irgendwie an den Leerzeichen von meinem Wunschverzeichnis (C:\Users\Public\Documents\Hyper-V\Virtual hard disks).
Mit dem u.a. abgeänderten Script schaffe ich es, die VM in "C:\Users\Public\Documents\Hyper-V\" abzulegen. Leider aber nicht in den Unterordner "Virtual hard disks". Da kommt immer eine Fehlermeldung. Ich habe schon hier und da Anführungszeichen gesetzt, aber leider ohne Erfolg.
Vlt hast du darüberhinaus auch noch eine Lösung parat, wie man die VM-Dateien mit der Endung .vmcx, .vmrs und .vmgs in das Standardverzeichnis bekommt (bei mir "C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines").
Das Script von ct trägt die Dateien zusammen mit der .vhdx-Datei ein (also im Augenblick
"C:\Users\Public\Documents\Hyper-V\" (Virtual hard disks)

Code: Alles auswählen

@echo off
setlocal enabledelayedexpansion

set Hinweis=Bitte lesen Sie unbedingt die Anleitung zu diesem Skript in c't 20/2020!


rem --------- Variablen fuer das Skript setzen  -----------

rem *** Arbeitsverzeichnis ***
rem Pfad des Ordners, in dem das Skript liegt.
rem Falls eine Antwortdatei in die VHD-Datei soll, muss sie 
rem als "autounattend.xml" ebenfalls hier liegen.
set workdir=%~d0%~p0

rem *** Temporaerer Unterordner ***
rem Wird standardmaessig im Arbeitsverzeichnis erstellt.
set folder=%~n0-tmp

rem --------- Variablen fuer die VM setzen  -----------

rem *** VM: Anzahl der virtuellen CPUs
set cpu=4

rem *** VM: Start-RAM-Groesse in MByte ***
set startram=2048

rem *** VM: Minmale RAM-Groesse in MByte ***
set minram=1024

rem *** VM: Maximale RAM-Groesse in MByte ***
set maxram=4096

rem *** VM: Netzwerkswitch auswaehlen. Zum Aktivieren "rem" vor der naechsten Zeile entfernen und bei Bedarf Switchname in Anfuehrungsstrichen (') anpassen
set switch=-switchname 'default switch'

rem *** VM: Automatische Pruefpunkte an (1) oder aus (0)
set autocheckpoints=0

rem *** VM: Generation 1 (Legacy BIOS) oder 2 (UEFI)? ***
set gen=2

rem *** Namen der VM festlegen ***
set vmname=Server_vNext

rem --------- Variablen fuer die VHD(x) setzen  -----------

rem *** VHD: (maximale) Dateigroesse in MByte ***
set vhdsize=127000

rem *** VHD-Typ: 0 (feste Groesse) oder 1 (dynamisch wachsend) ***
set vhdtyp=1

rem *** VHD: Partitionsgroesse Boot-/EFI-Partition ***
set partboot=500

rem *** VHD: Partitionsgroesse MSR-Partition ***
set partmsr=128

rem *** VHD: Partitionsgroesse Recovery-Partition ***
set partre=1000

rem --------- Variablen fuer die unbeaufsichtigte Installation -----------

rem *** 64-Bit-Antwortdatei ***
set autox64=Autounattendx64.xml

rem *** 32-Bit-Antwortdatei ***
set autox86=Autounattendx86.xml

rem ------------- Ende der Anpassungen -----------

set operation=*** Hilfe erwuenscht? ***
if /i %1.==. goto hilfe
if /i %1.==/?. goto hilfe
if /i %1.==-?. goto hilfe
if /i %1.==/h. goto hilfe
if /i %1.==-h. goto hilfe
if /i %1.==--h. goto hilfe
if /i %1.==/help. goto hilfe
if /i %1.==-help. goto hilfe
if /i %1.==--help. goto hilfe

rem *** Optik anpassen ***
cls
color 0F
set farbtmp=
for /f "tokens=3" %%b in ('reg query ^"HKLM^\Software^\Microsoft^\Windows NT^\CurrentVersion^" /v ^"ReleaseID^" 2^>nul') do set farbtmp=%%b >nul 2>nul
if "%farbtmp%."=="." goto start

set ESC=
set weiss=%esc%[97m
set gruen=%esc%[92m
set rot=%esc%[91m
set gelb=%esc%[93m

:start
echo.%gelb%
echo ****************************************************
echo ***        Willkommen bei c't-Win2Hyper-V        ***
echo ****************************************************
echo.
echo %hinweis%%weiss%
echo.

echo *** Einige Pruefungen vorab ... ***
echo.

set operation=*** Temporaerer Ordner bereits vorhanden? ***
if not exist %workdir%%folder% goto istfrei
set /a foldernr=1
set tempfolder=%folder%
:ring
set /a foldernr=%foldernr%+1 
set folder=%tempfolder%-%foldernr%
if exist %workdir%%folder% goto ring
:istfrei

set operation=*** Skript braucht mindestens Windows 10 Versin 1709 ***
for /f "tokens=3" %%a in ('reg query ^"HKLM^\SOFTWARE^\Microsoft^\Windows NT^\CurrentVersion^" /v ^"ReleaseID^"') do set versionhost=%%a
if %versionhost% lss 1709 goto fehler1

set operation=*** Skript muss mit Administratorrechten laufen ***
whoami /groups | find "S-1-16-12288" > nul
if errorlevel 1 goto fehler1

set operation=*** Hyper-V muss aktiviert sein ***
dism /online /get-features /format:table | find "Microsoft-Hyper-V " | find "Aktiviert" > nul
if errorlevel 1 goto fehler1

set operation=*** Hyper-V-Modul fuer Windows PowerShell muss aktiviert sein ***
dism /online /get-features /format:table | find "Microsoft-Hyper-V-Management-PowerShell" | find "Aktiviert" > nul
if errorlevel 1 goto fehler1

set operation=*** Es muss eine ISO-, WIM- oder ESD-Datei uebergeben werden ***
set pfad=%*
set pfad="%pfad:"=%"
if .%pfad:~-4,3% neq .wim if .%pfad:~-4,3% neq .esd if .%pfad:~-4,3% neq .iso goto fehler1

echo *** Keine Probleme gefunden, jetzt geht es los ***
echo.

if .%pfad:~-4,3% neq .iso (
  set wim=%pfad%
  goto wahl
)

set operation=*** ISO-Datei einbinden ***
echo %weiss%%operation%%gruen%
set iso="%pfad:"=%"
powershell "mount-diskimage '%iso%'"
if errorlevel 1 goto fehler2
set isolw=
for /f "skip=3" %%i in ('powershell "get-diskimage '%iso%' | get-volume | select driveletter"') do set isolw=%%i
if "%isolw%."=="." goto fehler2

set operation=*** ISO-Datei muss WIM- oder ESD-Datei enthalten ***
if exist %isolw%:\sources\install.esd (
  set wim=%isolw%:\sources\install.esd
) else if exist %isolw%:\sources\install.wim (
  set wim=%isolw%:\sources\install.wim
) else (
  goto fehler1
)
if errorlevel 1 goto fehler2

:wahl
set operation=*** Image auswaehlen ***
echo %weiss%%operation%%gruen%
set index=1
set letztenummer=1
for /f "tokens=1,2* delims=: " %%L in ('%windir%\system32\dism /get-wiminfo /wimfile:%wim%') do (
   if "%%L"=="Index" set /a letztenummer=%%M
)
if %letztenummer% equ 1 goto weiter
%windir%\system32\dism /english /get-wiminfo /wimfile:%wim% 
if errorlevel 1 goto fehler2
echo.%gelb%
set /p Index=Nummer des Images eingeben:
echo.

set operation=*** Pruefe ausgewaehltes Image ***
echo %weiss%%operation%%gruen%

set operation=*** Ausgewaehltes Image muss vorhanden sein ***
if %index% gtr %letztenummer% goto fehler1
if %index% lss 1 goto fehler1
echo.
:weiter

set Operation=*** In Generation-2-VMs laeuft nur x64-Windows ***
for /f "tokens=*" %%L in ('%windir%\system32\dism /english /get-wiminfo /wimfile:%wim% /index:%index% ^| find "Architecture"') do (set archtmp=%%L)
set architektur=%archtmp:~15%
if %gen%==2 if not %architektur%==x64 goto fehler1

set Operation=*** In Generation-2-VMs laufen weder Vista noch Windows 7 ***
for /f "tokens=*" %%L in ('%windir%\system32\dism /english /get-wiminfo /wimfile:%wim% /index:%index% ^| find "Version"') do (set vertmp=%%L)
set version=%vertmp:~10%
set alter=neu
if not %version:~0,3%==6.2 if not %version:~0,3%==6.3 if not %version:~0,3%==6.4 if not %version:~0,3%==10. set alter=alt
if %gen%==2 if %alter%==alt goto fehler1

echo %gruen%OK
echo.

set Operation=*** Speicherpfad fuer VMs auslesen ***
echo %weiss%%operation%%gruen%
echo.
set vmpfad=
for /f "tokens=3" %%a in ('reg query ^"HKLM^\SOFTWARE^\Microsoft^\Windows NT^\CurrentVersion^\Virtualization^" /v ^"DefaultExternalDataRoot^" 2^>nul') do set vmpfad=%%a
if "%vmpfad%."=="." set vmpfad=%public%\Documents\Hyper-V\
echo Gespeichert wird die VM unter: %vmpfad%
echo.
pause
set Operation=*** Temporaeren Ordner anlegen *** 
echo %weiss%%operation%%gruen%
echo.
md %workdir%%folder%
echo Temporaerer Ordner angelegt: %workdir%%folder%
echo.

set operation=*** Release-ID auslesen ***
echo %weiss%%operation%%gruen%
echo.
%workdir%7z.exe e %wim% -o%workdir%%folder% %index%\Windows\System32\config\Software >nul 2>nul
reg load HKLM\VHD %workdir%%folder%\software >nul 2>nul
if errorlevel 1 goto fehler2
set reltmp=
for /f "tokens=3" %%b in ('reg query ^"HKLM^\VHD^\Microsoft^\Windows NT^\CurrentVersion^" /v ^"ReleaseID^" 2^>nul') do set reltmp=%%b >nul 2>nul
if "%reltmp%."=="." echo Keine Release-ID gefunden. && goto unload
echo Release-ID ist %reltmp% 
set release=%reltmp%_
:unload
reg unload HKLM\VHD >nul 2>nul
if errorlevel 1 goto fehler2
echo.


md %vmpfad%%vmname%
echo Als Name der VM wird festgelegt: %vmname%
echo.

set operation=*** Freien Laufwerksbuchstaben fuer Windows-Partition in VHD(X) suchen ***
echo %weiss%%operation%%gruen%
echo.
for %%l in (P Q R S T U V W X Y Z D E F G H I J K L M N O) do (  
  set vhdlw=%%l
  mountvol %%l: /L >nul
  if errorlevel 1 (
    subst | findstr /B "%%l:" >nul
    if errorlevel 1 (
      net use %%l: >nul 2>&1
      if errorlevel 1 goto weiter2
    )
  )
)
goto fehler1
:weiter2
echo Verwende %vhdlw%:
echo.

subst %vhdlw%: %workdir%%folder% 
set operation=*** Freien Laufwerksbuchstaben fuer Boot-Partition in VHD(X) suchen ***
echo %weiss%%operation%%gruen%
echo.
for %%l in (P Q R S T U V W X Y Z D E F G H I J K L M N O) do (  
  set efilw=%%l
  mountvol %%l: /L >nul
  if errorlevel 1 (
    subst | findstr /B "%%l:" >nul
    if errorlevel 1 (
      net use %%l: >nul 2>&1
      if errorlevel 1 goto weiter3
    )
  )
)
goto fehler1
:weiter3
subst %vhdlw%: /d
echo Verwende %efilw%:
echo.

set operation=*** VHD erzeugen ***
echo %weiss%%operation%%gruen%
if %vhdtyp%==1 (set typ=expandable) else set typ=fixed
set format=vhd
if %gen%==2 set format=vhdx
echo create vdisk file=%vmpfad%%vmname%\%vmname%.%format% maximum=%vhdsize% type=%typ% > %workdir%%folder%\diskpart.txt
echo attach vdisk >> %workdir%%folder%\diskpart.txt
if %gen%==2 (
  echo convert gpt >> %workdir%%folder%\diskpart.txt
  echo create partition efi size=%partboot% >> %workdir%%folder%\diskpart.txt
  echo format fs=fat32 quick label="System" >> %workdir%%folder%\diskpart.txt
) else (
  echo create partition primary size=%partboot% >> %workdir%%folder%\diskpart.txt
  echo format quick fs=ntfs label="System" >> %workdir%%folder%\diskpart.txt
  echo active >> %workdir%%folder%\diskpart.txt
)
echo assign letter=%efilw% >> %workdir%%folder%\diskpart.txt
if %gen%==2 echo create partition msr size=%partmsr% >> %workdir%%folder%\diskpart.txt
echo create partition primary >> %workdir%%folder%\diskpart.txt
echo shrink minimum=%partre% >> %workdir%%folder%\diskpart.txt
echo format fs=ntfs quick label="Windows" >> %workdir%%folder%\diskpart.txt
echo assign letter=%vhdlw% >> %workdir%%folder%\diskpart.txt
echo create partition primary >> %workdir%%folder%\diskpart.txt
echo format quick fs=ntfs label="Recovery" >> %workdir%%folder%\diskpart.txt
if %gen%==1 (
  echo set id=27 >> %workdir%%folder%\diskpart.txt
) else (
  echo set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac" >> %workdir%%folder%\diskpart.txt
  echo gpt attributes=0x8000000000000001 >> %workdir%%folder%\diskpart.txt
)
echo exit >> %workdir%%folder%\diskpart.txt
diskpart /s %workdir%%folder%\diskpart.txt
if errorlevel 1 goto fehler2

echo.
set operation=*** Image in VHD kopieren ***
echo %weiss%%operation%%gruen%
dism /apply-image /imagefile=%wim% /index:%index% /applydir=%vhdlw%:
if errorlevel 1 goto fehler2

echo.
set auto=%autox64%
if not %architektur%==x64 set auto=%autox86%
if not exist %~d0%~p0%auto% goto bcdboot
set operation=*** autounattend.xml ergaenzen ***
echo %weiss%%operation%%gruen%
echo.
md %vhdlw%:\windows\panther\unattend
copy %~d0%~p0%auto% %vhdlw%:\windows\panther\unattend\unattend.xml

:bcdboot
echo.
set operation=*** Bootloader ergaenzen ***
echo %weiss%%operation%%gruen%
echo.
if %gen%==1  bcdboot /d %vhdlw%:\windows /s %efilw%: /addlast /l de-de /f BIOS
if %gen%==2  bcdboot /d %vhdlw%:\windows /s %efilw%: /addlast /l de-de /f UEFI
if errorlevel 1 goto fehler2
echo.

set operation=*** Entfernen von Registry-Schluessel "MountedDevices" aus der VHD ***
reg load HKLM\VHD %vhdlw%:\windows\system32\config\system >nul 2>nul
if errorlevel 1 goto fehler2
reg query HKLM\VHD\MountedDevices >nul 2>nul
if errorlevel 1 goto unload 
echo %weiss%%operation%%gruen%
echo.
reg delete HKLM\VHD\MountedDevices /f >nul 2>nul
if errorlevel 1 goto fehler2
echo Registry-Schluessel entfernt
echo.
:unload
reg unload HKLM\VHD >nul 2>nul
if errorlevel 1 goto fehler2

set operation=*** VM erzeugen ***
echo %weiss%%operation%%gruen%
powershell new-vm -name '%vmname%' -path '%vmpfad%%vmname%' -VHDpath '%vmpfad%%vmname%\%vmname%.%format%'  -MemoryStartupBytes %startram%MB -generation %gen% %switch%
powershell set-vm -name '%vmname%' -ProcessorCount %cpu% -DynamicMemory -MemoryMaximumBytes %maxram%MB -MemoryMinimumBytes %minram%MB -AutomaticCheckpointsEnabled %autocheckpoints%
if %alter%==alt (
  powershell Remove-VMNetworkAdapter -vmname '%vmname%'
  powershell Add-VMNetworkAdapter -vmname '%vmname%' -IsLegacy $true
)

set operation=*** Temporaere Laufwerke wieder aushaengen ***
echo %weiss%%operation%%gruen%
echo.
if exist %workdir%%folder% rd /q /s %workdir%%folder%
if not %efilw%.==. if not %vhdlw%.==. if not %efilw%.==%vhdlw%. mountvol %efilw%: /d >nul 2>nul
if exist %vhdlw%: powershell dismount-vhd -path '%vmpfad%%vmname%\%vmname%.%format%'
if exist %isolw%: powershell "dismount-diskimage '%iso%'"

powershell Enable-VMIntegrationService -VMName '%vmname%' -Name 'Gastdienstschnittstelle'

set operation=*** Starte VM ***
echo %weiss%%operation%%gruen%
echo.
powershell Start-VM -name '%vmname%'
powershell vmconnect $env:COMPUTERNAME '%vmname%'
echo %weiss%*** Fertig! ***
echo.

goto :eof

rem *** Fehlerbehandlung ***

rem Bedingung nicht erfuellt
:fehler1
set text=Folgende Bedingung wurde nicht erfuellt: 
goto Fehlerausgabe

rem Fehler bei der Durchfuehrung
:fehler2
set text=Operation fehlgeschlagen:
goto Fehlerausgabe


:fehlerausgabe
echo.
echo %rot%%text%
echo.
echo %rot%%operation%
echo.
echo %rot%%hinweis%
echo.

:aufraeumen
set operation=*** Raeume hinter mir auf ***
pause
echo.
echo %weiss%%operation%%gruen%
echo.
if exist %workdir%%folder% rd /q /s %workdir%%folder%
if not %efilw%.==. mountvol %efilw%: /d >nul 2>nul
if exist %vhdlw%: powershell dismount-vhd -path '%vmpfad%%vmname%\%vmname%.%format%' >nul 2>nul
if exist %isolw%: powershell "dismount-diskimage '%iso%'" >nul 2>nul
echo.
set operation=*** Fertig! ***
echo %weiss%%operation%%gruen%
echo.
pause
echo.
goto :eof

:hilfe
echo.
echo %~nx0 erzeugt Hyper-V-VMs
echo.
echo Als Quelle akzeptiert %~nx0 WIM- und ESD-Dateien sowie 
echo ISOs und DVDs, die solche Dateien im Ordner "Sources" enthalten.
echo.
echo %~nx0 muss mit Administratorrechten gestartet werden!
echo.
echo %Hinweis%
echo.
pause
goto :eof
;
REM Erstellt 2020 von Axel Vahldiek/c't
REM mailto: axv@ct.de

Benutzeravatar
Holgi
Meister
Meister
Beiträge: 358
Registriert: 12.05.2018, 12:33
Geschlecht:

Re: Hyper-V Virtuelle Maschine per Script erstellen; mein Lösungsansatz

Beitrag von Holgi » 30.03.2021, 19:28

Für alle diejenigen, welche auch gerne mit Hyper-V arbeiten und so wie ich täglich diese
neues Netzwerk gefunden: möchten sie...
-Anzeige hatten.
Ich habe jetzt endlich eine Lösung dafür gefunden, diese Anzeige nicht mehr (oder höchtens einmalig) sehen zu müssen:
ein Eintrag in der Registry macht es möglich

Code: Alles auswählen

REG ADD "HKCU\System\CurrentControlSet\Control\Network\NewNetworkWindowOff" /F
bzw.

Code: Alles auswählen

REG ADD "HKLM\System\CurrentControlSet\Control\Network\NewNetworkWindowOff" /F
Nicht wundern: es ist nur der Eintrag in der Registry; kein DWORD, Zeichenfolge o.ä.
ehrlich gesagt, ich weiß nicht, welcher von beiden der richtige ist; deshalb lasse ich beide eintragen (per SetupComplete).

Noch ein Tip:
wer gerne mit RDP arbeitet, um auf die VM zuzugreifen, muss nicht unbedingt erst in die Einstellungen gehen um dort RemoteDesktop zu aktivieren. Ich lasse das mit 2 Powershell Befehlen (per SetupComplete) erledigen:

Code: Alles auswählen

Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server'-name "fDenyTSConnections" -Value 0
Enable-NetFirewallRule -DisplayGroup "Remotedesktop"

Benutzeravatar
Holgi
Meister
Meister
Beiträge: 358
Registriert: 12.05.2018, 12:33
Geschlecht:

Re: Hyper-V Virtuelle Maschine per Script erstellen; mein Lösungsansatz

Beitrag von Holgi » 06.05.2021, 19:27

ein weitere Möglichkeit, eine .vhd(x) Datei aus einer ISO (mit Wim!) oder direkt aus einer WIM zu erstellen, bietet MS selbst an.
Die haben mal ein Powershell-Script mit dem Namen Convert-WindowsImage.ps1 entwickelt. Das war wohl seinerzeit für die Nano-Server entwickelt worden. Zu finden ist das Script auf dem Server 2016 Bereitstellungsmedium, aber auch im Netz z.B. hier:
https://github.com/x0nn/Convert-WindowsImage
Beispiele hier: https://catonrug.blogspot.com/2019/12/w ... 0-vhd.html
die grafische Oberfläche von dem Script funktioniert nicht mehr. MS entwickelt es nicht mehr weiter!
Vorgehensweise:
1. open Powershell as admin
2. ins Verzeichnis mit dem PS-Script (Convert-WindowsImage.ps1) wechseln
3. ". .\Convert-WindowsImage.ps1" eingeben (Punkt, Leerzeichen, Punkt, Backslash); der Vorgang nennt sich DotSource(ing)
4. dann PS-Script mit Schaltern aufrufen
Beispiel:
Convert-WindowsImage -SourcePath $pwd\install.wim -Edition "Windows Server 2019 DataCenter (Desktopdarstellung)" -VHDFormat VHDX -VHDPath "C:\Users\Public\Documents\Hyper-V\Virtual hard disks\Server 2019.vhdx" -SizeBytes 40GB -DiskLayout UEFI -ExpandOnNativeBoot:$false -UnattendPath "$pwd\autounattend.xml" -RemoteDesktopEnable -Passthru

$pwd ist das aktuelle Verzeichnis (mit dem PS-Script). Dort also die WIM (oder ISO) und ggf. die autounattend.xml ablegen.
Schon wird aus der WIM (oder ISO mit WIM) eine Hyper-V virtuelle Maschine.
Wenn hier jemand mitliest und sich mit Powershell auskennt, hätte ich gerne mal folgende Frage beantwortet:
a) im Netz habe ich mal eine Abwandlung von dem Script gesehen, wo das Dotsourcing nicht mehr nötig war. Das Script war aber ansonsten veraltet. Weiß jemand, wie man die .ps verändern muss, damit das funktioniert? Hintergrund:
ich möchte nicht erst eine Powershell öffnen, sondern das ganze automatisiert per Batch machen.
b) Meine anderen PS-Scripte rufe ich per
PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""%~dpn0.ps1""' -Verb RunAs}"
auf. Wenn das Script selbst keine Schalter zum Funktionieren braucht läuft das prima.
weiß jemand, wie/wo/an welcher Stelle in dem Strang ich bei dem Convert-Image.ps1 Script da die Schalter (z.B. -SourcePath, -VHDFormat etc.) hierzu unterbringe? Was in Klammern, was in Anführungszeichen?

Antworten