none
【PowerShell】パスワード変更時にローカルセキュリティポリシーが反映されない

    質問

  • 質問内容

    Windows PowerShellを使用して、Windowsパスワードを変更する処理を作成しています。
    以下のソースコードを作成して、Windowsパスワードの変更はできました。
    しかし、ローカルセキュリティポリシーを一部を除き満たしていないにもかかわらずWindowsパスワードが変更できてしまいます。
    一部というのは「パスワードの長さ:8文字以上」の設定をしているときに、8文字以下パスワードで変更した場合には、パスワードポリシーを満たしていませんとエラーが発生されますが、その他の条件ではエラーが発生せずWindowsパスワードを変更することができます。
    具体的にいうと、「パスワードの履歴を記録する:2回」と設定しているにもかかわらず、現在のWindowsパスワードど同一のパスワードで変更することができてしまいます。

    そこでご質問ですが、ローカルセキュリティポリシーをすべて満たしている場合のみWindowsパスワードを変更し、満たしていない場合はエラーを出力する方法はないのでしょうか。


    PowerShell ソースコード

    function ChangePassword($UserID, $Password){

    $hostname = hostname
    [ADSI]$UpdateUser = "WinNT://$HostName/$UserID,User"
    $UpdateUser.SetPassword($Password)
    $UpdateUser.SetInfo()

    }

    $UserID = "TEST"
    $Password = "TEST123456"
    ChangePassword $UserID $Password


    ローカルセキュリティポリシー設定

    パスワードのポリシー
    Lパスワードの長さ:8文字以上
    Lパスワードの変更禁止期間:1日
    Lパスワードの有効期間:90日
    Lパスワードの履歴を記録する:2回
    L暗号化を元に戻せる状態でパスワードを保存する:無効
    L複雑さの要件を満たす必要があるパスワード:無効


    恐れ入りますが、ご教授願えますでしょうか。

    2018年8月9日 0:01

回答

すべての返信

  • セキュリティポリシーの「パスワードの履歴を記録する」は、ユーザーがパスワードを「変更」する際に適用されるルールです。

    一方、SetPasswordは、現在のパスワードが何であれ、指定のパスワードに「リセット」する、管理者用のメソッドです。

    そのため、ユーザーが以前どのようなパスワードを入力していたかが考慮されないのは、妥当な動作なんじゃないかと思います。

    2018年8月9日 1:06
    モデレータ
  • ご返信ありがとうございます。

    SetPasswordは指定のパスワードに「リセット」する、管理者用メソッドだったんですか。理解しました。

    では、Powershellでローカルセキュリティポリシーを考慮したパスワード変更する方法はないのでしょうか。

    恐れ入りますがよろしくお願いいたします。

    2018年8月9日 2:19
  • SetPasswordの代わりにChangePasswordメソッドを使って、

    $UpdateUser.ChangePassword($oldPassword, $newPassword)

    とする方法が考えられます。ただこの方法は、ユーザーが現在設定しているパスワードを知っている必要があります。

    パスワード履歴に関するセキュリティポリシーを考慮しつつ、現在のパスワードを知らずに、新しいパスワードを設定する方法というのは、ADSI単独では難しいと思われます。

    LDAPのAPIを直接叩いて頑張る方法が以下のページにありました。C#のコードですが、PowerShellに移植することは不可能ではないと思います。

    Resetting passwords honoring password history (or what’s happening under the hood when changing / resetting passwords) – Coding from the field

    • 回答としてマーク Begin_Pro 2018年8月9日 5:30
    2018年8月9日 3:11
    モデレータ
  • 解決いたしました。

    $UpdateUser.ChangePassword($oldPassword, $newPassword)を使用して、問題なくセキュリティポリシーを考慮しつつ、パスワード変更することができました。

    ChangePasswordメソッドの存在を知りませんでした。知識不足でお恥ずかしい限りです。

    今までご助言くださりありがとうございます。

    2018年8月9日 5:30