Re: Hyper-V Virtuelle Maschine per Script erstellen; mein Lösungsansatz
Verfasst: 03.03.2023, 00:54
https://www.deskmodder.de/phpBB3/
Code: Alles auswählen
Set-VMFirmware -VMName %vmname% -EnableSecureBoot Off
Code: Alles auswählen
PowerShell Set-VMFirmware -VMName %vmname% -EnableSecureBoot Off
Code: Alles auswählen
. .\Convert-WindowsImage.ps1
Code: Alles auswählen
Convert-WindowsImage -SourcePath "C:\NTLite\install.wim" -VHDFormat "VHDX" -Edition "Windows 11 Pro" -SizeBytes 50GB -DiskLayout "UEFI" -VHDPath "C:\NTLite\WIN11_22H2.vhdx" -UnattendPath "C:\NTLite\autounattend.xml"
Code: Alles auswählen
@echo off
setlocal enabledelayedexpansion
COLOR 0a
chcp 1252 >nul
:: BatchGetAdmin
:-------------------------------------
REM --> Check for permissions
IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) ELSE (
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
)
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params= %*
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
:gotAdmin
pushd "%CD%"
CD /D "%~dp0"
rem --------- Variablen fuer die VM setzen -----------
rem *** VM: Anzahl der virtuellen CPUs
set cpu=2
rem *** VM: Start-RAM-Groesse in MByte ***
set startram=2048
rem *** VM: Minmale RAM-Groesse in MByte ***
set minram=2048
rem *** VM: Maximale RAM-Groesse in MByte ***
set maxram=8192
rem *** VM: Netzwerkswitch auswaehlen. Zum Aktivieren "rem" vor der naechsten Zeile entfernen und bei Bedarf Switchname in Anfuehrungsstrichen (') anpassen
set switch=-switchname 'VLAN'
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 *** Nur für Generation 2: TPM aktiv? (0: aus, 1: an) ***
set TPM=0
if %gen%==2 set TPM=0
rem *** VHD Größe in GB
set VHDSize=64GB
rem *** GEN1=vhd GEN2=vhdx
set format=vhd
if %gen%==2 set format=vhdx
rem *** Speicherpfad fuer VMs auslesen ***
echo.
set vmpfad=C:\NTLITE\VM
cls
echo Gespeichert wird die VM unter:
echo %vmpfad%
echo.
rem --------- Ende Variablen fuer die VM setzen -----------
echo.
ECHO \\!//
ECHO (o o)
ECHO -------------------------------oOOo-(_)-oOOo-------------------------------
echo Im folgenden Schritt geben Sie der VM einen Namen.
echo Sollte eine VM mit gleichem Namen bereits existieren,
echo wird diese unwiederbringlich entfernt...
Echo ---------------------------------------------------------------------------
set /p VMName= "Geben Sie den Namen der ISO ein (z.B. NTlite): "
echo.
cls
rem set ISO="Pfad zu den Windows Installationsdateien (z.B. C:\Windows11_TPM): "
rem set ISO=C:\NTLITE\ISO
rem set VHDX="Pfad zur vorhandenen Windows VHDX-Datei (z.B. C:\Windows11_TPM): "
set VHDX=%~dp0%VMNAME%.vhdx
echo.
echo *** Einige Pruefungen vorab ... ***
echo.
IF NOT EXIST %VMPFAD% (
echo Das Verzeichnis %VMPFAD% ist nicht vorhanden
goto Fehler
)
set operation=*** Skript braucht mindestens Windows 10 Version 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 fehler
set operation=*** Skript muss mit Administratorrechten laufen ***
whoami /groups | find "S-1-16-12288" > nul
if errorlevel 1 goto fehler
set operation=*** Hyper-V muss aktiviert sein ***
dism /online /get-features /format:table | find "Microsoft-Hyper-V " | find "Aktiviert" > nul
if errorlevel 1 goto fehler
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 fehler
cls
echo *** Keine Probleme gefunden, jetzt geht es los ***
echo.
Echo ********************************************************************
Echo Erstelle virtuelle Maschine %VMName%
echo aus der VHDX %VHDX%
Echo bitte warten Sie einen Augenblick ...
Echo ********************************************************************
PowerShell Stop-VM -Name "%VMName%" -Force >nul
PowerShell Remove-VM -Name "%VMName%" -Force >nul
PowerShell Remove-Item "%VMPFAD%\%VMName%.vhdx" -Force >nul
Echo "%VMName%" deleted !!
echo Erstelle VM %VMName%
powershell new-vm -name '%vmname%' -MemoryStartupBytes %startram%MB -generation %gen% %switch%
Powershell Add-VMHardDiskDrive -VMName '%vmname%' -Path '%VHDX%'
Echo Virtuelle Maschine anpassen...
powershell set-vm -name '%vmname%' -ProcessorCount %cpu% -DynamicMemory -MemoryMaximumBytes %maxram%MB -MemoryMinimumBytes %minram%MB -AutomaticCheckpointsEnabled %autocheckpoints% -CheckpointType Disabled
powershell Enable-VMIntegrationService -VMName '%vmname%' -Name 'Gastdienstschnittstelle'
if %gen%==2 (
if %TPM%==1 (
powershell Set-VMKeyProtector -VMName '%vmname%' -NewLocalKeyProtector
powershell Enable-VMTPM -vmname '%vmname%'
)
)
if %gen%==1 (
powershell Remove-VMNetworkAdapter -vmname '%vmname%'
powershell Add-VMNetworkAdapter -vmname '%vmname%' -IsLegacy $true
)
rem set bootdevice vhdx
powershell Set-VMFirmware -VMname '%vmname%' -FirstBootDevice (Get-VMHardDiskDrive -VMName '%vmname%')[0]
rem Videoauflösung einstellen
powershell set-vmvideo -VMName '%vmname%' -ResolutionType Maximum -HorizontalResolution 1600 -VerticalResolution 1200
rem automatische Start-/StoppAktionen einrichten
powershell Set-VM -VMName '%vmname%' -AutomaticStartAction StartIfRunning -AutomaticStopAction Save -Confirm:$false
rem ExposeVirtualizationExtensions
rem powershell Set-VMProcessor -VMName '%vmname%' -ExposeVirtualizationExtensions $true
echo.
powershell Start-VM -name '%vmname%'
echo.
powershell vmconnect $env:COMPUTERNAME '%vmname%'
goto eof
rem *** Fehlerbehandlung ***
:fehler
echo Es wurde ein Fehler gefunden
pause
:eof
exit
REM Credits to Axel Vahldiek/c't
REM modded by Holgi & g-force @ Deskmodder.de
Code: Alles auswählen
rem ISO zu VHDX konvertieren
powershell Convert-WindowsImage -SourcePath "%ISO%\%VMNAME%\sources\install.wim" -VHDFormat "VHDX" -Index "1" -SizeBytes 50GB -DiskLayout "UEFI" -VHDPath "%VMPFAD%\%VMNAME%.vhdx" -UnattendPath "%ISO%\%VMNAME%\autounattend.xml"
rem Add DVD Drive to Virtual Machine
powershell Add-VMDvdDrive -vmname %VMNAME% -Path %ISO%\%VMName%.iso
rem Bootreihenfolge setzen
rem powershell Set-VMFirmware -VMname '%vmname%' -FirstBootDevice (Get-VMDvdDrive -VMName '%vmname%')[0]
powershell Set-VMFirmware -VMname '%vmname%' -FirstBootDevice (Get-VMHardDiskDrive -VMName '%vmname%')[0]
rem Secure-Boot ausschalten
powerShell Set-VMFirmware -VMName %vmname% -EnableSecureBoot Off
rem Videoauflösung einstellen
powershell set-vmvideo -VMName '%vmname%' -ResolutionType Maximum -HorizontalResolution 1600 -VerticalResolution 1200
rem automatische Start-/StoppAktionen einrichten
powershell Set-VM -VMName '%vmname%' -AutomaticStartAction StartIfRunning -AutomaticStopAction Save -Confirm:$false
rem ExposeVirtualizationExtensions
powershell Set-VMProcessor -VMName '%vmname%' -ExposeVirtualizationExtensions $true
Bezieht sich aber auf die Umwandlung ISO -> VHDXVirtuelle Maschine anpassen...
Convert-WindowsImage : Die Benennung "Convert-WindowsImage" wurde nicht als
Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der
Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ Convert-WindowsImage -SourcePath C:\NTLITE\ISO\NTLITE\sources\install ...
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Convert-WindowsImage:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Code: Alles auswählen
powershell -ExecutionPolicy Unrestricted -NoLogo -Command "Get-Date"
Code: Alles auswählen
set switches=-ExecutionPolicy Unrestricted -NoLogo -Command
Code: Alles auswählen
powershell %switches% "Get-Date"
Code: Alles auswählen
set-executionpolicy unrestricted -force -scope CurrentUser
Code: Alles auswählen
Windows PowerShell
Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.
Lernen Sie das neue plattformübergreifende PowerShell kennen – https://aka.ms/pscore6
PS C:\WINDOWS\system32> set-executionpolicy unrestricted -force -scope CurrentUser
PS C:\WINDOWS\system32> get-executionpolicy
Unrestricted
PS C:\WINDOWS\system32>
Code: Alles auswählen
Sicherheitswarnung
Führen Sie ausschließlich vertrauenswürdige Skripts aus. Skripts aus dem Internet können zwar nützlich sein, stellen
jedoch auch eine potenzielle Gefahr für Ihren Computer dar. Wenn Sie diesem Skript vertrauen, lassen Sie mit dem Cmdlet
"Unblock-File" die Ausführung des Skripts ohne die Warnmeldung zu. Möchten Sie "C:\ntlite\Convert-WindowsImage.ps1"
ausführen?
[N] Nicht ausführen [M] Einmal ausführen [H] Anhalten [?] Hilfe (Standard ist "N"):
Code: Alles auswählen
Convert-WindowsImage -SourcePath "$pwd\install.wim" -VHDFormat "VHDX" -Edition "Windows 11 Pro" -SizeBytes 50GB -DiskLayout "UEFI" -VHDPath "$pwd\WIN11_22H2.vhdx" -UnattendPath "$pwd\autounattend.xml"
Code: Alles auswählen
Windows(R) Image to Virtual Hard Disk Converter for Windows(R)
Copyright (C) Microsoft Corporation. All rights reserved.
Copyright (C) 2019 x0nn
Version 10.0.14278.1000.amd64fre.rs1_es_media.160201-1707
Code: Alles auswählen
Die Benennung "Convert-WindowsImage" wurde nicht als
Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt.
Code: Alles auswählen
powershell -NoLogo -Command "& '.\Convert-WindowsImage.ps1' -SourcePath "%ISO%\%VMNAME%\sources\install.wim" -VHDFormat "VHDX" -Index "1" -SizeBytes 50GB -DiskLayout "UEFI" -VHDPath "%VMPFAD%\%VMNAME%.vhdx" -UnattendPath "%ISO%\%VMNAME%\autounattend.xml"
Verstehe ich jetzt nicht. Hat womit nichts zu tun?