Scroll Top

Fehlender Laufwerksbuchstabe

Laufwerksbuchstabe fehlt nach mounten einer virtuellen Festplatte mit Windows 11 oder Server 2022.

Martin Handel

Ich nutze seit Jahren selbstgeschriebene PowerShell-Skripte um VMs unter Hyper-V zu erzeugen.

Diese VMs können Read-Write Domain Controller, Read-Only Domain Controller, Memberserver oder Memberworkstations sein. Für mich war aber immer wichtig: ich mag nichts mit der Konfiguration der VMs direkt zu tun haben.

Somit benötigte ich eine Automatisierung, welche auf Basis eines Sysprep-Images / ParentDisk die notwendigen Konfigurationen durchführt (z. B. das Setzen vom Computername, IP-Adresse, Gateway, DomainJoin etc).

Dazu erstelle ich auf dem Hyper-V-Host Konfigurationsdateien, welche dann via Registry „RunOnce“ in der VM aufgerufen werden.

Fehlender Laufwerksbuchstabe

Diese Konfigurationsdateien müssen aber in die VM kopiert werden. Zudem muss in der Registry der VM das „RunOnce“ gesetzt werden. Aus diesem Grund mounte ich die VHDS-Datei der VM bevor diese im Hyper-Visor eingeschaltet wird.

Fehlender Laufwerksbuchstabe

Nicht wirklich Raketentechnik.

Kein Laufwerksbuchstabe

Unter Hyper-V Windows Server 2019 und einer VM mit Windows Server 2022 oder Windows 11 fehlt nach dem Mounten aber gelegentlich der Laufwerksbuchstabe.

Aber von Anfang an.

Mounte ich eine mit sysprep vorbereitete Festplatte mit Windows 10 unter Hyper-V 2019 passiert folgendes:

Virtuelle Festplatte

Durch das Einhängen in den Hyper-V-Host wurde hier der Primary Partition der Laufwerksbuchstabe „E“ zugeordnet.

Mit dem eindeutigen Laufwerksbuchstaben kann ich anschließend meine Konfigurationsdateien kopieren, die Registry laden und modifizieren, alles gut.

Bei Windows 11 und Server 2022 sieht das aber manchmal, nicht immer, so aus:

Fehlender Laufwerkbuchstabe

Alte Skriptroutine greift nicht mehr

Meine alte Skriptroutine greift jetzt nicht mehr.

Die alte Routine hat einfach geschaut, welche Laufwerke es vor dem Mounten gab. Anschließend wurde gemountet und die Differenz der Laufwerkbuchstaben festgestellt. Der neue Laufwerksbuchstabe ist die gemountete Festplatte.

Ja, da kann man mehr prüfen aber für meine Belange war das ausreichend.

Laufwerksbuchstabe fehlt

Neue Skriptroutine notwendig

Ich benötige also eine Routine, die etwas tiefer blickt, was es da an Festplatten gibt:

Laufwerksbuchstabe fehlt
  Zeile 365: [char[]]$TempDriveLetters = [char[]]'EFGHIJKLMNOPQRSTUVWXYZ'

Die möglichen übrigen Laufwerksbuchstaben („A“, „B“ und „C“ sind ausgenommen, ebenso die Umlaute).

  Zeile: 366: $driveb4 = (Get-PSDrive).Name

Vergebene Laufwerke (alle) vor dem Mounten

  Zeile 367: Mount-VHD -Path "$VMPath\$Computername\Virtual Hard Disks\$Computername.vhdx"

Mounten der virtuellen Festplatte

  Zeile 368: $DriveLetter = (((Compare-Object -ReferenceObject $driveb4 -DifferenceObject 
$TempDriveLetters).where{ $_.SideIndicator -eq "=>" }).InputObject)[0]

Welcher Laufwerksbuchstabe ist noch verfügbar, gemessen an dem Array der möglichen Laufwerksbuchstaben?

  Zeile 369: $DriveLetterwColon = $DriveLetter + ":"

Der ermittelte nächste freie Laufwerksbuchstabe wird noch mit einem Doppelpunkt in einer Variablen gespeichert.

  Zeile 370: $Disk = (Get-Disk).where{ $_."FriendlyName" -eq "Msft Virtual Disk" }

Welche lokale Platte ist vom „FriendlyName“ her eine „Msft Virtual Disk“. Normaler Weise ist keine VHDX-Datei im Regelbetrieb gemountet, daher war das für mich das ideale Kriterium. Was ich brauche ist die Disknummer.

Jetzt brauche ich nur noch die DiskPartition vom Typus „Basic“, die soll nämlich nachher den nächsten freien Laufwerksbuchstaben bekommen.

  Zeile 371: $Partition = (Get-Partition $Disk.Number).where{ $_.Type -eq "Basic" }

Fast am Ziel: jetzt kann es aber sein, dass die Partition einen Laufwerksbuchstaben hat. Das passiert manchmal doch bei Windows 11- und Server 2022-VHDX-Dateien, wenn diese unter Server 2019 gemountet werden.

Also die Zeilen 372 bis 375 mit „if / else“: Sofern bei der gemounteten VHDX-Datei kein gültiger Laufwerksbuchstabe festgestellt wird, bekommt diese Partition den nächst möglichen Laufwerkbuchstaben zugeordnet.

if ($Partition.DriveLetter -notmatch "[A-Z]")
{
$Partition | Set-Partition -NewDriveLetter $DriveLetter
} else { some super complicated stuff here }

Demnach in Summe:

[char[]]$TempDriveLetters = [char[]]'EFGHIJKLMNOPQRSTUVWXYZ'
$driveb4 = (Get-PSDrive).Name
Mount-VHD -Path "$VMPath\$Computername\Virtual Hard Disks\$Computername.vhdx"
$DriveLetter = (((Compare-Object -ReferenceObject $driveb4 -DifferenceObject 
$TempDriveLetters).where{ $_.SideIndicator -eq "=>" }).InputObject)[0]
$DriveLetterwColon = $DriveLetter + ":"
Disk = (Get-Disk).where{ $_."FriendlyName" -eq "Msft Virtual Disk" }
$Partition = (Get-Partition $Disk.Number).where{ $_.Type -eq "Basic" }
if ($Partition.DriveLetter -notmatch "[A-Z]") {
$Partition | Set-Partition -NewDriveLetter $DriveLetter
} else { some super complicated stuff here }
Fehlender Laufwerksbuchstabe