6

私のアプリケーションでは、ユーザーがアプリから自分のローカル Windows ユーザー アカウントを制御できることを行っています。つまり、ユーザーの作成、パスワードの設定/削除、パスワードの変更、およびアプリからのパスワード有効期限ポリシーの呼び出しが可能です。さて、この時点で、ユーザーが次回のログイン時にパスワードを変更したい場合、どうなるかを把握する必要があります。多くのフォーラムやブログがこれについて述べているように、私はそれに応じてコーディングを行いました。

次回のログイン時にパスワードの有効期限を呼び出す

 public bool InvokePasswordExpiredPolicy()
    {
        try
        {
            string path = GetDirectoryPath();
            string attribute = "PasswordExpired";
            DirectoryEntry de = new DirectoryEntry(path);
            de.RefreshCache(new string[] { attribute });
            if(de.Properties.Contains("PasswordExpired"))
            de.Properties[attribute].Value = 1;
            de.CommitChanges();
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

次回ログイン時にパスワードの有効期限が切れるようにします。フラグをリセット

public bool ProvokePasswordExpiredPolicy()
    {
        try
        {
            string path = GetDirectoryPath();
            string attribute = "PasswordExpired";
            DirectoryEntry de = new DirectoryEntry(path);
            de.RefreshCache(new string[] { attribute });
            de.Properties[attribute].Value = -1;
            de.CommitChanges();
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

当該フラグが設定されているかどうかの確認

public bool isPasswordPolicyInvoked()
    {
        try
        {
            string path = GetDirectoryPath();
            string attribute = "PasswordExpired";
            DirectoryEntry de = new DirectoryEntry(path);
            de.RefreshCache(new string[] { attribute });
            int value = Convert.ToInt32(de.Properties[attribute].Value);

            if (value == 1)
                return true;
            else
                return false;
        }
        catch (Exception)
        {
            return false;
        }
    }

LDAP ではなく WinNT を使用してディレクトリ パスを取得しています。次の方法を使用して、ディレクトリ パスを取得しました。

private String GetDirectoryPath()
    {
        String uName = this.userName;
        String mName = this.userMachine;

        String directoryPath = "WinNT://" + mName + "/" + uName;

        return directoryPath;
    }

私が欠けているものはありますか?ここで私を助けてください。

注:最初に、pwdLastSet属性を0(オンの場合)および-1(オフの場合)に設定して、「プロパティキャッシュにディレクトリプロパティが見つかりません」という例外をスローしましたが、後でWinNTがこの属性をサポートしていないことを発見しました。フラグを設定するには、PasswordExpiredを 1 にする必要があります。それが私がしたことです。

4

4 に答える 4

6

代わりに System.DirectoryServices.AccountManagement を使用するのはどうでしょうか。その場合、次のコードを呼び出すことができます。

UserPrincipal.Current.ExpirePasswordNow();
于 2012-06-27T02:00:03.083 に答える
-3
de.Properties["passwordExpired"][0] = 1; <br>
de.CommitChanges();
于 2013-01-09T06:29:08.627 に答える