Im Folgenden finden Sie einen PowerShell-Code, mit dem Sie das tun können, wonach Sie suchen:
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
Objekt funktioniert jedoch nicht für maschinenlokale Konten. Daher kann der obige Code nicht mit der WinNT://...
Syntax nachgerüstet werden .
(Möchte jemand eine Bearbeitung mit Code vorschlagen, um zwischen lokalen und Domain-Konten zu unterscheiden?)
Bei einem völlig anderen Ansatz NetUserChangePassword
funktioniert die alte API auch mit lokalen (und Domänen-) Konten, sofern Sie den Domänennamen in der 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)
Dieser Code setzt voraus, dass Sie ein Kennwort auf dem lokalen Computer ändern (".").
PS1
Skript, das mit oder ohne Parameter aufgerufen werden kann. Es ist auch viel besser lesbar. Bei Code geht es darum, dass Menschen verstehen, was jemand anderes geschrieben hat, nicht den Computer. Keine Lösung ist schneller als die andere.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Es wurde jedoch "Das Kennwort entspricht nicht den Anforderungen der Kennwortrichtlinie ..." zurückgegeben. Das neue Passwort erfüllt jedoch diese Anforderungen.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
In PowerShell ist das eigentlich ganz einfach:
quelle
Ich habe beide oben genannten Antworten ohne Erfolg versucht, um das Kennwort eines lokalen Administrators zu ändern, der nicht der Domäne angehört. Das Durchsuchen der Kommentare ergab jedoch das, was ich brauchte.
Für den zweiten Teil der aktuell akzeptierten Antwort möchten Sie die Signatur so aktualisieren, dass sie
long
anstelle desbool
Rückgabewerts verwendet wird, und diese können in den Dokumenten mit den Systemfehlercodes behoben werden . So endest du mit:Das hat aber bei mir nicht geklappt. Die Fehlercodes wechselten zwischen 86 und 2221, je nachdem, wie ich die Parameter einrichte. Ich wollte aufgeben und mich mehr mit den Kommentaren befassen und fand schließlich Erfolg darin, Folgendes zu tun:
Absolut lächerlich, dass das einfache ÄNDERN eines lokalen Administratorkennworts in Powershell so kompliziert ist. Wenn Sie auf Ihrem System Sicherheitszeichenfolgen speichern, muss das Kennwort mit dem alten Kennwort aktualisiert werden. Andernfalls besteht die Gefahr, dass Sie die Möglichkeit verlieren, diese Sicherheitszeichenfolgen ordnungsgemäß zu entschlüsseln.
quelle