vergessenes ESXi-Kennwort über vCenter wiederherstellen (PowerCLI)
Wer kennt es nicht? Ein neuer ESXi-Server wird installiert oder der vSphere-Administrator verlässt das Unternehmen und das Kennwort der ESXi-Server ist nicht dokumentiert. Oder die Datei in der das Kennwort gespeichert wurde, geht verloren. Das ist ärgerlich, denn möchte man den ESXi-Server ohne vCenter verwalten oder in das Inventar eines neuen vCenters hinzufügen, so benötigt man dieses.
Der bislang einzige supportete Weg das Root-Kennwort eines ESXi-Servers zu resetten, ist die erneute Installation des Servers (vgl.: https://kb.vmware.com/s/article/1317898). Das ist erst recht sehr ärgerlich wenn man kein Backup der Konfiguration des Servers hat.
Es gibt die Möglichkeit auf die lokale ESXCLI eines ESXi-Servers über eine PowerCLI-Sitzung zuzugreifen, selbst wenn die PowerCLI-Sitzung auf ein vCenter verbunden ist. Vorraussetzung dafür ist das der entsprechende ESXi-Host auch im Inventar des vCenter-Servers vorhanden ist.
Der hier beschriebene Weg funktioniert erst ab vSphere 6, da erst dort die notwendigen Commands hinzugefügt wurden.
1 2 3 4 5 6 7 8 9 10 |
$cred = Get-Credential -UserName "root" -Message "Bitte geben Sie einen existierenden ESXi-Nutzernamen und ein neues Passwort ein"; $vmhost = Get-VMHost #Hole alle ESXi-Server bei denen das Kennwort geändert werden soll ForEach($vmhostItem IN $vmhost) { $esxcli = get-esxcli -vmhost $vmhostItem -v2; #ESXCLI aufrufen $arguments = $esxcli.system.account.set.CreateArgs(); #Argumente für die Funktion abrufen $arguments.id = $cred.UserName; #Nutzername setzen. Der Nutzername wird aus der vorherigen Credential-Abfrage entnommen. $arguments.password = $cred.GetNetworkCredential().Password; #Hier wird das Passwort gesetzt. Auch dieses wird aus der vorherigen Credential-Abfrage entnommen. $arguments.passwordconfirmation = $cred.GetNetworkCredential().Password; #Das Passwort wird nochmal, zur Bestätigung, gesetzt. $esxcli.system.account.set.Invoke($arguments); #Die Funktion wird aufgerufen. } |
Bei Bedarf kann man noch eine Ausgabe einbauen, in der man z.B. sehen kann welcher Host gerade bearbeitet wird. Auch lässt sich natürlich exakt bestimmen welche Hosts bearbeitet werden sollen. Man muss dafür lediglich die Variable $vmhost
entsprechend befüllen. Dies geht entweder z.B. mit Get-Cluster "Name" | Get-VMHost
oder mit Get-VMhost "Name"
oder auf jede andere beliebige Art die VMHost-Objekte zurückgibt.
Ich betreue eine vSphere-Umgebung die regelmäßig eine größere Anzahl an neuen ESXi-Hosts erhält. Da das Installationsteam ein anderes als das Betriebsteam ist, werden die Kennwörter bei der Übergabe entsprechend geändert. Dieses Script minimiert dabei den notwendigen Aufwand.