Wer einen Standalone Microsoft Hyper-V Server laufen hat, der wird von Zeit zu Zeit sich auf dem Server aufschalten wollen um zu schauen wie die Lage so ist, oder man möchte eine neue VM einrichten und stellt dann auf einmal fest, dass kein Zugang mehr zum Server über die MMC möglich ist.
Was ist in so einem Fall passiert? Ganz einfach, dass Passwort ist abgelaufen und schon klappts nicht mehr mit der Kommunikation. In der Grundkonfiguration ist immer alle sechs Wochen Schluss!
Was hilft? Natürlich Powershell. Also zuerst Powershell installieren: http://newyear2006.wordpress.com/2011/04/15/powershell-beim-microsoft-hyper-v-server-installieren/
Dieser Artikel beschreibt, wie man mittels Powershell auf die lokalen Gruppen und Benutzer zugreifen kann, nämlich mittels WinNT-Management Provider. http://blogs.technet.com/b/heyscriptingguy/archive/2008/03/11/how-can-i-use-windows-powershell-to-add-a-domain-user-to-a-local-group.aspx, weitere Infos gibt es hier: http://msdn.microsoft.com/en-us/library/windows/desktop/aa772237(v=vs.85).aspx
Der Aufruf
$user = [adsi]"WinNT://./Benutzername"
sorgt für die Initialisierung eines Objekts vom lokalen Rechner (.) des angegebenen Benutzers.
Gibt man nun
$user
ein, wird nicht viel angezeigt:
distinguishedName :
Path : WinNT://./Benutzername
Wenn man aber
$user | fl *
verwendet, wird es interessant:
UserFlags : {513}
MaxStorage : {-1}
PasswordAge : {322374}
PasswordExpired : {0}
LoginHours : {255 255 255 255 255 255 255 255 255 255 255 255 2
55 255 255 255 255 255 255 255 255}
FullName : {}
Description : {}
BadPasswordAttempts : {0}
LastLogin : {09.03.2012 15:13:47}
HomeDirectory : {}
LoginScript : {}
Profile : {}
HomeDirDrive : {}
Parameters : {}
PrimaryGroupID : {513}
Name : {Benutzername}
MinPasswordLength : {0}
MaxPasswordAge : {3628800}
MinPasswordAge : {0}
PasswordHistoryLength : {0}
AutoUnlockInterval : {1800}
LockoutObservationInterval : {1800}
MaxBadPasswordsAllowed : {0}
objectSid : {1 5 0 0 0 0 0 5 21 …}
AuthenticationType : Secure
Children : {}
Guid : {xxx}
ObjectSecurity :
NativeGuid : {xxx}
NativeObject : System.__ComObject
Parent : WinNT://WORKGROUP/.
Password :
Path : WinNT://./Benutzername
Properties : {UserFlags, MaxStorage,
PasswordAge, PasswordExpired…}
SchemaClassName : User
SchemaEntry : System.DirectoryServices.DirectoryEntry
UsePropertyCache : True
Username :
Options :
Site :
Container :
Interessant sind davon die UserFlags, welche als Custom User Properties laufen: http://msdn.microsoft.com/en-us/library/windows/desktop/aa746535(v=vs.85).aspx. Den UserFlags können Werte aus einer Auflistung ADS_USER_FLAG_ENUM zugewiesen werden, welche hier beschrieben wird: http://msdn.microsoft.com/en-us/library/windows/desktop/aa772300(v=vs.85).aspx. Dort gibt es nun auch den Eintrag:
ADS_UF_DONT_EXPIRE_PASSWD = 65536, // 0x10000
welcher diese Umschreibung hat:
ADS_UF_DONT_EXPIRE_PASSWD
When set, the password will not expire on this account.
Also lange Rede, kurzer Sinn, man gibt
$user.UserFlags.value = $user.UserFlags.value –bor 0×10000
ein und schon ist es vorbei. OK, nicht ganz, denn man muss die Änderung noch abspeichern:
$user.CommitChanges()
Aber das wars jetzt.
Überprüfen lässt es sich ganz einfach durch ein kurzes
net user <Benutzername>
welches zuvor so aussah
Konto aktiv Ja
Konto abgelaufen Nie
Letztes Setzen des Kennworts 05.03.2012 22:36:58
Kennwort läuft ab 16.04.2012 22:36:58
Kennwort änderbar 05.03.2012 22:36:58
Kennwort erforderlich Ja
Benutzer kann Kennwort ändern Ja
und danach
Konto aktiv Ja
Konto abgelaufen Nie
Letztes Setzen des Kennworts 05.03.2012 22:36:58
Kennwort läuft ab Nie
Kennwort änderbar 05.03.2012 22:36:58
Kennwort erforderlich Ja
Benutzer kann Kennwort ändern Ja
Wer diese Funktion auf einem anderen Windows Server, der in einer Domäne läuft, ausführen möchte, wird an diesen Scripts gefallen finden: http://richardspowershellblog.wordpress.com/2012/02/08/setting-password-to-never-expire/
Und für alle alten VBler: http://msdn.microsoft.com/en-us/library/windows/desktop/aa746537(v=vs.85).aspx die Variante in VB.