【问题标题】:LDAP: Unable to Change PasswordLDAP:无法更改密码
【发布时间】:2013-07-10 20:19:12
【问题描述】:

我正在编写 c# 代码以由用户本人或管理员更改 ldap 用户的密码。 我可以成功地对用户进行身份验证。但是,当我尝试调用 ChangePasswordSetPassword 行为时,我收到以下错误消息:

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;
        }
    }

我想知道如何解决此问题以成功更改密码。谢谢各位

更新: 我尝试了以下几个选项,但它们都不起作用: 一:

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 部分中的任何设置是否重要。

问题: 我是否有权使用管理员帐户以这种方式更改用户的密码,而不是使用任何模拟代码?

【问题讨论】:

    标签: c# active-directory ldap directoryentry


    【解决方案1】:

    如果您使用的是 .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 中与用户和组一起玩变得非常容易!

    【讨论】:

    • 但是,我们没有为每个用户设置 UPN。使用 UserPrincipal 有问题吗?此外,我们没有使用 AD 域模型。所以 ContextType 是关于 ApplicationDirectory 的。
    • @HanYiZhang:NO! 使用它——它工作得很好!您可以通过 SAM 帐户名称、显示名称和其他一些属性来搜索用户 - UPN 的存在不是要求
    • 谢谢。您能否使用 DN 编辑 LDAP 服务器通信的答案?我试图查找类型为 DN 的身份,但找不到此用户。
    • @HanYiZhang: consult the relevant MSDN documentation for PrincipalContext 查看创建该上下文类的各种重载和方法
    • 我仍在等待我的问题的答案。还是比较喜欢用 DirectoryEntry Invoke 来做的,就是想知道异常怎么弄
    【解决方案2】:

    您在使用 Active Directory 吗?

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

    网址看起来不正确。

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

    -吉姆

    【讨论】:

    • 谢谢吉姆。此 url 成功验证旧密码。我应该使用相同的更改密码吗?
    • 问题已解决,但 usepropertycache 不是问题。关键点是:我使用 admin ldap 用户来更改用户的密码,我应该使用 setpassword 而不是 changepassword
    • 要重置密码,您需要使用新密码更改 LDAP unicodePwd,但您必须拥有正确的权限才能这样做。您没有提供旧密码。不确定这个调用方法我正在使用其他东西,我无法弄清楚为什么它在代码中不起作用。
    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 2020-02-29
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多