Obwohl man ja eher Benutzerkonten unter Verzeichnisdiensten wie Active Directory verwaltet und dadurch auch eine zentrale Umbenennung bei Namensänderung u.a sehr gut mit der Windows PowerShell durchgeführt werden kann, kommt es doch manchmal vor, dass man lokale Benutzerkonten umbenennen muss. Dazu reicht es dann leider auch nicht aus, nur in der SAM-Datenbank (SAM, Security Account Manager) den Usernamen anzupassen. Zu den weiteren Attributen zählen der vollständige Name, der Benutzerprofilordner und der dazugehörige Eintrag in der Registry.
Hierbei gibt es keine besondere Anforderung an die PowerShell Version.
Die Ausführung benötigt jedoch administrative Berechtigungen unter einem separaten Benutzerkonto!
Zuerst ist es sinnvoll, drei wichtige Namens-Informationen abzufragen und in Variablen abzulegen, dazu verwendet man Read-Host.
$old = Read-Host "Alter Username"
$new = Read-Host "Neuer Username"
$name = Read-Host "Neuer Fullname"
Die erste Umbenennung erfolgt beim Username. Es ist tatsächlich gar nicht so einfach, eine geeignete Möglichkeit zu finden. Ich habe mich schließlich für WMI (Windows Management Instrumentation) entschieden. Es ist zwar nicht gerade für seine Performance bekannt, bietet jedoch gerade in der PowerShell die Objektunterstützung an, welche uns die Arbeit wieder enorm vereinfacht! Eine andere Möglichkeit wäre noch ADSI WinNT, was ich jedoch als eher umständlich und veraltet ansehe.
Mit Get-WmiObject rufen wir die Klasse Win32_UserAccount auf und filtern nach dem alten Username. Dieses mache ich aufgrund von Performance-Vorteilen nicht mit der gwmi Filter-Funktion, sondern mit Where-Object. Das Ergebnis sollte jetzt den gefundenen User enthalten und durch die einzige vorhandene Methode dieses Objektes können wir ein Umbenennen durchführen.
(gwmi Win32_UserAccount | ?{$_.Name -eq $old}).Rename($new)
Als Nächstes machen wir uns das altbekannte „Net User“ zunutze, welches übrigens keine Umbenennung des Usernames unterstützt! Jedoch kann man damit den vollständigen Namen einfach anpassen.
net user $new /fullname:$name
Über Rename-Item wird dann der Benutzerprofilordner-Name geändert.
Rename-Item C:\Users\$old $new
Als Letztes passen wir dann noch den entsprechenden Benutzerprofilpfad in der Registry an. Damit man nicht umständlich die User SID (Security Identifier) ermitteln muss, wird die Ausgabe von Get-ItemProperty mit Where-Object nach dem alten Profilpfad gefiltert und dieser danach durch Set-ItemProperty mit dem neuen Pfad ersetzt.
gp "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*" | ?{$_.ProfileImagePath -eq "C:\Users\$old"} | sp -Name ProfileImagePath -Value "C:\Users\$new"
In einem späteren Artikel werde ich dann die Umbenennung eines Active Directory Benutzerkontos mit der Windows PowerShell aufzeigen.
http://faq-o-matic.net/?p=5597