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