Frage Wie kann ein Windows-Standardbenutzer sein Kennwort über die Befehlszeile ändern?


Unter Windows Server 2008 R2 habe ich einen lokalen Standardbenutzer (kein Administrator) (kein Active Directory-Konto, obwohl sich der Server in einer Domäne befindet), der nur über PowerShell Remoting auf den Server zugreifen kann. Der Benutzer kann sich nicht über RDP anmelden.

Ich möchte, dass dieser Benutzer sein Passwort ändern kann. Der Befehl 'net user' benötigt Administratorrechte, auch wenn der Benutzer versucht, sein eigenes Passwort zu ändern.

Wie kann ein Standardbenutzer sein Kennwort über die Befehlszeile ändern?


18
2018-01-28 16:31


Ursprung




Antworten:


Nachfolgend finden Sie einen PowerShell-Code, mit dem Sie nach Domain-Konten suchen können:

param (
    [string]$oldPassword = $( Read-Host "Old password"),
    [string]$newPassword = $( Read-Host "New password")
)

$ADSystemInfo = New-Object -ComObject ADSystemInfo
$type = $ADSystemInfo.GetType()
$user = [ADSI] "LDAP://$($type.InvokeMember('UserName', 'GetProperty', $null, $ADSystemInfo, $null))"
$user.ChangePassword( $oldPassword, $newPassword)

Der ASDI-Provider unterstützt auch die Syntax WinNT://computername/username für die ChangePassword() Methode. Das ADSystemInfo Das Objekt wird jedoch nicht für maschinenlokale Konten funktionieren, also nur den obigen Code nachrüsten WinNT://... Syntax ist nicht praktikabel.

(Möchten Sie eine Änderung mit Code vorschlagen, um zwischen lokalen und Domänenkonten zu unterscheiden?)

Auf einem ganz anderen Weg, dem Alten NetUserChangePassword Die API funktioniert auch mit lokalen (und Domänen, sofern Sie den Domänennamen in NetBIOS-Syntax angeben):

param (
    [string]$oldPassword = $( Read-Host "Old password"),
    [string]$newPassword = $( Read-Host "New password")
)

$MethodDefinition = @'
[DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
public static extern bool NetUserChangePassword(string domainname, string username, string oldPassword, string newPassword);
'@

$NetAPI32 = Add-Type -MemberDefinition $MethodDefinition -Name 'NetAPI32' -Namespace 'Win32' -PassThru

$NetAPI32::NetUserChangePassword('.', $env:username, $oldPassword, $newPassword)

In diesem Code wird davon ausgegangen, dass Sie ein Kennwort auf dem lokalen Computer ändern (".").


18
2018-01-28 18:14



Du schlägst mich dazu, aber ich gewinne für die Erhaltung der Charaktere;) Irgendeinen Grund, warum du weißt, dass die zusätzlichen Teile, die du benutzt hast, notwendig sind? Oder nur um formeller und richtiger zu sein? - charleswj81
Du bekommst definitiv den Code Golf Award. Ich bin einfach nur formell und korrekt ... Eigentlich ist es hauptsächlich, um das Skript ein wenig brauchbarer für andere zu machen, die Cut-and-Paste-Typen sein könnten. - Evan Anderson
@ charleswj81 - Evans Antwort ist viel vollständiger. Es ist ein Standalone PS1 Skript, das mit oder ohne Parameter aufgerufen werden kann. Es ist auch viel lesbarer. Beim Code geht es darum, dass der Mensch versteht, was jemand anderes geschrieben hat, nicht der Computer. Keine der Lösungen wird schneller sein als die andere. - Mark Henderson♦
Das sieht vielversprechend aus, aber ich sollte klarstellen, dass das Konto lokal für das System ist. Ich habe Folgendes versucht: ([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")Aber das hat zurückgegeben: "Das Passwort entspricht nicht den Passwortrichtlinien ...". Das neue Passwort erfüllt diese Anforderungen jedoch. - elijahbuck
Nach dem Hinzufügen des Benutzers zu Remotedesktopbenutzern und dem Versuch, das Kennwort auf diese Weise zu ändern, wird derselbe Fehler angezeigt. Ich glaube, dass die korrekte Vorgehensweise zum Ändern eines lokalen Kontos Folgendes ist: ([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS") - elijahbuck


Dies ist in PowerShell eigentlich ziemlich einfach:

([ADSI]'LDAP://CN=User,CN=Users,DC=domain').ChangePassword('currentpassword','newpassword')

9
2018-01-28 19:03





Ich habe beide obigen Antworten vergeblich versucht, das Passwort eines lokalen Administrators zu ändern, der nicht mit der Domäne verbunden ist. Das Durchblättern der Kommentare ergab jedoch, was ich brauchte.

Für den zweiten Teil der aktuell akzeptierten Antwort möchten Sie die zu verwendende Signatur aktualisieren long anstatt bool Rückgabewert, und diese können bei behoben werden die Systemfehlercodes docs. Also hast du am Ende:

param (
    [string]$oldPassword = $( Read-Host "Old password"),
    [string]$newPassword = $( Read-Host "New password")
)

$MethodDefinition = @'
[DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
public static extern **long** NetUserChangePassword(string domainname, string username, string oldPassword, string newPassword);
'@

$NetAPI32 = Add-Type -MemberDefinition $MethodDefinition -Name 'NetAPI32' -Namespace 'Win32' -PassThru

$NetAPI32::NetUserChangePassword('.', $env:username, $oldPassword, $newPassword)

Aber das funktioniert nicht für mich. Die Fehlercodes wechselten zwischen 86 und 2221, je nachdem, wie ich die Parameter einstelle. War kurz davor aufzugeben und grub mehr in die Kommentare ein und fand schließlich Erfolg:

([ADSI]'WinNT://./USERNAME').ChangePassword("OLDPASS‌​", "NEWPASS")

Absolut lächerlich, dass das einfache ÄNDERN eines lokalen Admin-Passworts in Powershell so kompliziert ist. Wenn Sie Sicherungsstrings auf Ihrem System speichern, muss das Passwort mit dem alten Passwort aktualisiert werden, sonst besteht die Gefahr, dass Sie die Möglichkeit verlieren, diese sicheren Strings ordnungsgemäß zu entschlüsseln.


3
2018-03-28 01:28