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 (".").