Я попробовал оба ответа выше, но безрезультатно, для смены пароля локального администратора, который не присоединен к домену. Копаясь в комментариях, я получил то, что мне было нужно.
Для второй части текущего принятого ответа вы хотите обновить подпись, чтобы использовать long
вместо bool
возвращаемого значения, и это можно устранить в документации по системным ошибкам . Итак, вы в конечном итоге:
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)
Однако это не сработало для меня. Коды ошибок чередовались от 86 до 2221, в зависимости от того, как я настроил параметры. Собирался сдаться и больше копаться в комментариях, и, наконец, добился успеха в выполнении:
([ADSI]'WinNT://./USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Абсолютно нелепо, что простое ИЗМЕНЕНИЕ пароля локального администратора так сложно в Powershell. Если в вашей системе вообще хранятся строки безопасности, то обновление пароля должно быть выполнено с предоставлением старого пароля, иначе вы рискуете потерять способность правильно расшифровать эти строки безопасности!