Ось код PowerShell для того, щоб робити те, що ви шукаєте, з обліковими записами домену:
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)
Провайдер ASDI також підтримує синтаксис WinNT://computername/username
для ChangePassword()
методу. ADSystemInfo
Об'єкт, однак, не буде працювати для машин локальних рахунків, так що просто дооснащення коду вище WinNT://...
синтаксис не працездатний.
(Хтось хоче запропонувати змінити w / код для розмежування між локальними та доменними обліковими записами?)
У зовсім іншому варіанті старий NetUserChangePassword
API також буде працювати з локальними (і доменними, за умови, що ви вкажете ім'я домену в синтаксисі NetBIOS):
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)
Цей код передбачає, що ви змінюєте пароль на локальній машині (".").