C#代码错误而改变的Active Directory用户的密码

问题描述:

C# code  

> error--->>>Unknown name. (Exception from HRESULT: 0x80020006 
> (DISP_E_UNKNOWNNAME)) 

和代码是这样的C#代码错误而改变的Active Directory用户的密码

using (DirectoryEntry entry = new DirectoryEntry("LDAP://admin-jyt69gl7t.hello/CN=Users,DC=hello")) 
{ 
    entry.Username = username; 
    entry.Password = strOldPassword; 

    DirectorySearcher searcher = new DirectorySearcher(entry); 

    try 
    { 
     searcher.FindOne(); 
     entry.AuthenticationType = AuthenticationTypes.Secure; 
     entry.Invoke("ChangePassword", new object[] { strOldPassword, strNewPassword }); 
     // oDE.Invoke("SetPassword", new object[] { strNewPassword }); 
     entry.CommitChanges(); 
    } 
    catch (Exception excep) 

我得到这个例外

> Unknown name. (Exception from HRESULT: 0x80020006 
> (DISP_E_UNKNOWNNAME)) 
+0

代码请进入编辑模式,然后再次把你的代码。如果有任何错误。 – sikender

+0

'entry'的类型是什么? – Gabe

+4

**向我们展示**您用来创建“条目”的LDAP字符串! –

此错误说你没发现用户通过您的LDAP查询。检查找到该用户的代码,然后再次运行查询。

DISP_E_UNKNOWNNAME显示活动目录正在响应该尝试,但无法根据目录条目中提供的名称找到用户。有些事情要尝试/验证:

  1. 验证您的目录条目是否填充了正确的信息。
  2. 确认您的条目的用户名实际存在于AD中。
  3. 验证用户名所属的OU是否反映在您的查询中。

我以前收到这个错误,并且普遍地(对我来说)它围绕目录条目和AD内用户的最终位置之间的断开连接。 OU差异会导致或中断连接。

只需按照下

using System.DirectoryServices; 


private DirectoryEntry GetUser(string UserName) 

{ 

    DirectoryEntry de = GetDirectoryObject(); 
    DirectorySearcher deSearch = new DirectorySearcher(); 
    deSearch.SearchRoot = de; 

    deSearch.Filter = "(&(objectClass=user)(SAMAccountName=" + UserName + "))"; 
    deSearch.SearchScope = SearchScope.Subtree; 
    SearchResult results = deSearch.FindOne(); 

    if (!(results == null)) 
    { 
     // **THIS IS THE MOST IMPORTANT LINE** 
     de = new DirectoryEntry(results.Path, "username", "password", AuthenticationTypes.Secure); 
     return de; 
    } 
    else 
    { 
     return null; 
    } 
} 

private DirectoryEntry GetDirectoryObject() 

{ 

    DirectoryEntry oDE; 
    oDE = new DirectoryEntry("LDAP://192.168.1.101", "username", "password", AuthenticationTypes.Secure); 
    return oDE; 
} 


public static bool ChangePassword(string UserName, string strOldPassword, string strNewPassword) 

     { 

      bool passwordChanged = false; 

      DirectoryEntry oDE = GetUser(UserName, strOldPassword); 

      if (oDE != null) 
      { 
       try 
       { 
        // Change the password. 
        oDE.Invoke("ChangePassword", new object[] { strOldPassword, strNewPassword }); 
        passwordChanged = true; 
       } 
       catch (Exception ex) 
       { 
        Debug.WriteLine("Error changing password. Reason: " + ex.Message); 

       } 
      } 
      return passwordChanged; 
     }