回答:
ドメインアカウントで探していることを実行する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")
ドメインに参加していないローカル管理者のパスワードを変更するために、上記の両方の回答を無効にしました。コメントを掘り下げると、必要なものが得られました。
現在受け入れられている回答の2番目の部分についてはlong
、bool
戻り値の代わりに使用する署名を更新する必要があります。これらは、次の場所でトラブルシューティングできます。はシステムエラーコードdocs。したがって、次のようになります。
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では、ローカル管理者パスワードの単純な変更が非常に複雑であることは絶対にばかげています。システムにセキュアストリングを保存する場合、古いパスワードを指定してパスワードを更新する必要があります。そうしないと、これらのセキュアストリングを適切に復号化する能力を失う危険があります。