Seite 6 von 7

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

Verfasst: 03.03.2023, 00:54
von g-force
Holgi hat geschrieben: 01.03.2023, 22:46 Set-VMFirmware -VMName %VMNAME% -DisableSecureBoot
SecureBoot ist bei einer Hyper-V Gen2 voreingestellt.
Das funktioniert leider noch nicht. Fehlt da nicht ein abschließender Wert?

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

Verfasst: 03.03.2023, 08:30
von Holgi
sorry, wenn ich frage:
was genau möchtest du erreichen?
geht es darum, z.B. ein Windows 10 X86 zu installieren?
Dann ohne das TPM Zeugs, Gen1 und dann gibt es auch kein SecureBoot.
Sonst mal diesen Befehl probieren:

Code: Alles auswählen

Set-VMFirmware -VMName %vmname% -EnableSecureBoot Off

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

Verfasst: 03.03.2023, 09:51
von g-force
Wenn ich vom WDS-Server über PXE installieren möchte, funktioniert das nur ohne SecureBoot.

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

Verfasst: 03.03.2023, 10:15
von Holgi
ah, ok.
Der letzte vorgestellte Befehl funktioniert auf jeden Fall, wenn man ihn so über Powershell absetzt.
Also in einer cmd-Batch dann

Code: Alles auswählen

PowerShell Set-VMFirmware -VMName %vmname% -EnableSecureBoot Off

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

Verfasst: 03.03.2023, 12:00
von g-force
Jo, der Schalter funktioniert. Vielen Dank!

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

Verfasst: 03.03.2023, 22:17
von Holgi
wer es mal ausprobieren möchte:
es geht auch die VM Erstellung nicht von ISO, sondern von vhdx.
Diese muss man sich zunächst erzeugen (wenn man nicht auf fertige zurückgreifen kann).
Dazu nutzt man Convert-WindowsImage
https://github.com/x0nn/Convert-WindowsImage
Dotsource the script to load the functions
Powershell:

Code: Alles auswählen

. .\Convert-WindowsImage.ps1
ein Beispiel:
Powershell:

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"
macht aus der von NTLite erzeugten wim eine vhdx, die wir in Hyper-V einbinden können.
Das Script dafür sieht dann so aus:
cmd:

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

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

Verfasst: 04.03.2023, 16:11
von g-force
Ich habe versucht, das in mein Script einzubauen. Ich habe Pfade angepasst (lieber Variablen als absolute Pfade), Beschriftungen verändert/hinzugefügt:

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
Leider bekomme ich diesen Fehler: (Moment, mein Snipping-Tool streikt - Screenshot wird nachgereicht)
Virtuelle 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
Bezieht sich aber auf die Umwandlung ISO -> VHDX

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

Verfasst: 04.03.2023, 16:18
von Holgi
hast du das dotsourceing schon gemacht? damit werden die Funktionen freigeschaltet (oder so ähnlich).
Hier habe ich es mal etwas besser erklärt:
viewtopic.php?p=364135&hilit=dotsource#p364135

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

Verfasst: 04.03.2023, 16:20
von g-force
Ich habe nochmal hier nachgelesen: https://www.windowspro.de/wolfgang-somm ... stallieren
Ich habe das PS1-Script vorher nicht ausgeführt... :oops:

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

Verfasst: 04.03.2023, 16:23
von DK2000
Das ist ziemlich unsauber. Sollte so aussehen:

Code: Alles auswählen

powershell -ExecutionPolicy Unrestricted -NoLogo -Command "Get-Date"
Wobei man den Teil mit den Schaltern auch in eine Variable packen kann.

Code: Alles auswählen

set switches=-ExecutionPolicy Unrestricted -NoLogo -Command
Dann braucht man das nicht immer zu wiederholen.

Code: Alles auswählen

powershell %switches% "Get-Date"
Wobei das generell ziemlich Quark ist, jedes Cmdlet einzeln auszuführen.

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

Verfasst: 04.03.2023, 16:33
von Holgi
bei mir hat das hier geholfen:

Code: Alles auswählen

set-executionpolicy unrestricted -force -scope CurrentUser

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

Verfasst: 04.03.2023, 16:45
von g-force

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>
Trotzdem erscheint der Fehler weiterhin.

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

Verfasst: 04.03.2023, 16:56
von Holgi
Reihenfolge beachtet?
set unrestricted
dotsourcing
es kommt:

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"):
M drücken
dann in Powershell die lange Befehlskette eingeben. Hier mal ein neues Beispiel, wo alle Elemente im gleichen Ordner sind (inkl. des convert-windowsimage.ps1

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"
funktioniert bei mir
sieht dann so aus:

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

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

Verfasst: 04.03.2023, 16:57
von DK2000
Das hat ja auch damit nichts zu tun. Das sit nur für .ps1 Skripte in der PowerShell relevat.

Problem ist einfach die Syntax. Daher der Fehler

Code: Alles auswählen

Die Benennung "Convert-WindowsImage" wurde nicht als
Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren
Programms erkannt.
Convert-WindowsImage ist kein registriertes Cmdlet, sondern ein Skript. Das müsste dann so aussehen (hoffe ich jedenfalls):

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"
Kann aber sein, dass da noch Syntaxfehler drin sind. Ist etwas kompliziert, .ps1 über Batch mit Argumenten auszuführen. Und setzt voraus, das Convert-WindowsImage.ps1 im selben Pfad wie die .cmd ist. Ansonsten genauen Pfad eingeben .

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

Verfasst: 04.03.2023, 17:00
von Holgi
DK2000 hat geschrieben: 04.03.2023, 16:57 Das hat ja auch damit nichts zu tun. Das sit nur für .ps1 Skripte in der PowerShell relevat.
Verstehe ich jetzt nicht. Hat womit nichts zu tun?
Ich wollte nur, dass @g-force das mal nachvollziehen kann.
Also evtl. besser erst mal nichts ändern, sondern genau so abhandeln. Das muss funktionieren.