0

ユーザー自身または管理者が LDAP ユーザーのパスワードを変更するための C# コードを実行しています。ユーザーを正常に認証できます。ChangePasswordただし、またはSetPassword動作を呼び出そうとすると、次のエラー メッセージが表示されます。

InnerException: ディレクトリ プロパティがキャッシュ内に見つかりません。

私のコードは次のとおりです。

LDAPPath = "LDAP://10.29.0.1:50405/DC=DCServerName,DC=local"
LDAPAdminDN = "CN=useradmin,OU=SystemAccounts,DC=DCServerName,DC=local"
LDAPAdminPwd = "S8kf5t3!"
username = "user1"
password = "oldPassword1"
npassword = "newPassword1"

DirectoryEntry root = new DirectoryEntry(
LDAPPath,
LDAPAdminDN,
LDAPAdminPwd,
AuthenticationTypes.None
);

using (root)
{
    DirectorySearcher searcher = new DirectorySearcher(root,
        string.Format("(CN={0})", username)
        );
    var result = searcher.FindOne();
    if (result != null)
    {
        var user = result.GetDirectoryEntry();
        try
        {
            user.Invoke("ChangePassword", new object[] { password, npassword });
            user.Properties["LockOutTime"].Value = 0; 
            //user.Invoke("SetPassword", new object[] { npassword });
            user.CommitChanges();
        }
        catch (Exception e)
        {
            string innerMsg = e.InnerException.Message;
            return false;
        }
    }

この問題を解決してパスワードを正常に変更する方法を知りたいです。君たちありがとう

更新: 以下のようにいくつかのオプションを試しましたが、すべてが機能しません: 1 つ:

int intPort = 50405;
user.Invoke("SetOption", new object[] { ADS_OPTION_PASSWORD_PORTNUMBER, intPort });
user.Invoke("SetOption", new object[] { ADS_OPTION_PASSWORD_METHOD, ADS_PASSWORD_ENCODE_CLEAR });

二:

user.UsePropertyCache = true;

それらはすべて0x80072020のエラーを受け取ります

私のIT担当者は「非SSLでパスワードを変更」を有効にしましたが、AD LDS部分で設定が重要かどうかはわかりません。

質問: なりすましコードを使用する代わりに、この方法で管理者アカウントを使用してユーザーのパスワードを変更する権利はありますか?

4

2 に答える 2

2

.NET 3.5 以降を使用している場合は、System.DirectoryServices.AccountManagement(S.DS.AM) 名前空間を確認してください。ここでそれについてすべて読んでください:

基本的に、ドメイン コンテキストを定義し、AD でユーザーやグループを簡単に見つけることができます。

// set up domain context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
    // find a user
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

    if(user != null)
    {
        user.ChangePassword(oldPassword, newPassword);
        user.UnlockAccount();
    }
}

新しい S.DS.AM を使用すると、AD でユーザーやグループを簡単に操作できます。

于 2013-07-10T20:23:34.787 に答える
0

Active Directory を使用していますか?

LDAP://10.29.0.1:50405/DC=DCServerName,DC=local

URL が正しくないようです。

user.UsePropertyCache = true; 次に: user.Invoke("ChangePassword", new object[] { password, npassword });

-ジム

于 2013-07-12T09:06:54.930 に答える