LDAP更改密码:HRESULT的异常:0x80070547

我正在尝试从未加入域的计算机上运行密码更改应用程序。从加入域的计算机上运行时,代码工作正常。所以现在,我通过SSL通过直接LDAP连接连接到AD。调用changepassword方法后,出现错误:

  

由于机器不可用或访问被拒绝,所以无法从域控制器读取配置信息。 (来自HRESULT的异常:0x80070547)。

我正在使用具有更改用户密码权限的服务帐户建立连接并运行该应用程序。

string adminUser = Domain + @"\" + Adminusername;
string adminPass = AdminUserPassword;
string ldapString = LDAPString;

DirectoryEntry de = new DirectoryEntry(ldapString,adminUser,adminPass,AuthenticationTypes.Secure);
DirectorySearcher deSearch = new DirectorySearcher(de) { SearchRoot = de,Filter = "(&(objectCategory=user)(cn=" + username + "))" };

SearchResult result = deSearch.FindOne();

if (result != null)
{
    var adContext = new PrincipalContext(ContextType.Domain);
    currentdc = adContext.ConnectedServer;

    DirectoryEntry userEntry = result.GetDirectoryEntry();

    if (userEntry != null)
    {
        userEntry.Invoke("ChangePassword",new object[] { OldPassword,NewPassword });
    }
}
jiahua004 回答:LDAP更改密码:HRESULT的异常:0x80070547

调用ChangePassword,调用IADsUser::ChangePassword。该文档说它的工作原理与IADsUser::SetPassword相同。该文档具有更多信息。确实,当您从域外部运行此方法时,只有第一种方法可以工作:

  

首先,LDAP提供程序尝试通过128位SSL连接使用LDAP。为了使LDAP SSL成功运行,LDAP服务器必须安装适当的服务器身份验证证书,并且运行ADSI代码的客户端必须信任颁发这些证书的权限。服务器和客户端都必须支持128位加密。

我认为您的LDAPString的格式为LDAP://example.com:636:636是重要部分)。如果您可以读取这样的数据,则表明SSL证书是受信任的。这样很好。

唯一可能缺少的部分可能是128位加密?检查证书,查看它是否使用了少于128位的证书。虽然我会感到惊讶。

此答案包含一小段代码,可用于从任何站点下载证书:https://stackoverflow.com/a/22251597/1202807

只需将“ https://example.com:636”用作“网站”。

还有这个:

  

在Active Directory中,呼叫者必须具有“更改密码”扩展控件访问权限才能使用此方法更改密码。

您应确保要向LDAP进行身份验证的用户帐户确实具有要尝试更新的帐户的“更改密码”权限。在我们的环境中,Everyone拥有“更改密码”权限(因为您仍然需要提供旧密码才能执行此操作)。我认为这是默认设置,但值得检查。

本文链接:https://www.f2er.com/3140944.html

大家都在问