2009-11-17 75 views
6

我在從我的WinForm應用程序訪問Active Directory時遇到了一些問題。我想要的是從Active Directory創建一個用戶和查詢用戶。爲什麼不能通過PrincipalContext聯繫Active Directory服務器?

這裏是發現用戶的代碼片段:

public bool FindUser(string username) 
{ 
    using (PrincipalContext context = new PrincipalContext(
     ContextType.Domain, 
     this.domainName, 
     this.DomainUserName, 
     this.DomainPassword)) 
    {     
     UserPrincipal user = UserPrincipal.FindByIdentity(context, username); 
     return (user != null) ? true : false; 
    } 
} 

我無法創建一個基於給定參數的PrincipalContext對象。我得到這個異常:

Exception: The server could not be contacted. 

和內部異常指出,

Inner Exception: The LDAP server is unavailable. 

,其中作爲域正在運行。我可以ping通它,也可以連接到這個域。

回答

1

您可以使用下面的代碼:

objectPath = "LDAP://CN=SC-5515_2,OU=Forus,DC=**MyDomainName**,DC=no"; 

public static bool Exists(string objectPath) 
{ 
    return DirectoryEntry.Exists(objectPath); 
} 

這是我已經使用這個代碼。它在測試Active Directory中是否存在任何對象時正常工作。

+0

我遇到了與指定的Active Directory有關的錯誤。 – Mohsan 2009-11-17 11:24:33

+0

然後您必須發佈更多信息。該代碼的作品,所以如果它不是那麼你proberbly通過錯誤的參數 – EKS 2009-11-17 11:46:16

+0

我的本地域它工作正常。但我無法在此域中創建用戶。所以出於測試目的,我在虛擬機,配置的域控制器上安裝了Windows 2003服務器。對於此虛擬機,我無法查詢Active Directory。 – Mohsan 2009-11-17 11:56:03

1

您可以嘗試下一個代碼。

public bool FindUser2(string userName) 
    { 
     try 
     { 
      DirectoryContext context = new DirectoryContext(
       DirectoryContextType.Domain, 
       domainName, 
       domainName + @"\" + domainUserName, 
       domainPassword); 
      DirectoryEntry domainEntry = Domain.GetDomain(context).GetDirectoryEntry(); 
      DirectorySearcher searcher = new DirectorySearcher(domainEntry, 
                   "(|(objectCategory=user)(cn=" + domainUserName + "))"); 
      SearchResult searchResult = searcher.FindOne(); 
      return searchResult != null; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
0

您還可以考慮使用System.DirectoryServices.Protocols訪問其他域。陡峭的學習曲線的位,但更快,更靈活 - 例如你可以做適當的異步搜索。

+1

請分享一些代碼示例。這將是很好的... – 2013-12-12 19:51:53

相關問題