2009-08-18 84 views
4

如果我設置了.NET DirectoryEntry.Path喜歡的東西:如何使用LDAP使用用戶名而非CN來查詢ActiveDirectory?

LDAP://CN=John Smith,OU=Group Name,DC=example,DC=com 

一切都很正常,我也得到我需要的DirectoryEntry。但是,我不知道用戶的真實通用名稱(CN)。我只知道他們的用戶名「John.Smith」。

那麼,我該如何查詢用戶名呢?我已經嘗試了所有以下成功:

LDAP://CN=John.Smith,OU=Group Name,DC=example,DC=com 
LDAP://sAMAccountName=John.Smith,OU=Group Name,DC=example,DC=com 
LDAP://userPrincipalName=John.Smith,OU=Group Name,DC=example,DC=com 
LDAP://[email protected],OU=Group Name,DC=example,DC=com 
LDAP://uid=John.Smith,OU=Group Name,DC=example,DC=com 
LDAP://o=John.Smith,OU=Group Name,DC=example,DC=com 

回答

9

你不能僅僅通過創建一個LDAP字符串進行查詢 - 你需要使用的代碼爲。

喜歡的東西:

DirectoryEntry deRoot = new DirectoryEntry("LDAP://yourserver/CN=Users,dc=YourCompany,dc=com"); 

DirectorySearcher dsFindUser = new DirectorySearcher(deRoot); 
dsFindUser.SearchScope = SearchScope.SubTree; 

dsFindUser.PropertiesToLoad.Add("sn"); // surname = last name 
dsFindUser.PropertiesToLoad.Add("givenName"); // first name 

dsFindUser.Filter = string.Format("(&(objectCategory=Person)(anr={0}))", yourUserName); 

SearchResult rseult = dsFindUser.FindOne(); 

if(result != null) 
{ 
    if(result.Properties["sn"] != null) 
    { 
     string lastName = result.Properties["sn"][0].ToString(); 
    } 

    if(result.Properties["givenName"] != null) 
    { 
     string lastName = result.Properties["givenName"][0].ToString(); 
    } 
} 

System.DirectoryServices.DirectorySearcher Class的完整MSDN文檔可以在MSDN上找到 - 它有很多的附加屬性和設置。

如果您使用的是.NET 3.5,那麼使用用於處理用戶和組的強類型例程庫會使事情變得容易得多 - 有關更多信息,請參閱此主題的優秀MSDN article

希望這有助於

馬克

+2

那麼奏效。感謝你的回答。 但是,LDAP不應該是查詢目錄的標準嗎?所以應該有一種方法來查詢一個像用戶名一樣的屬性?如果ActiveDirectory無法將重要屬性(如用戶名)暴露給LDAP查詢,爲什麼假裝支持LDAP?正如你所看到的,我仍然對ActiveDirectory感到憤怒。 – Robert 2009-08-18 17:29:05

+0

是的,LDAP絕對是目錄的標準 - 但這並不意味着將會有一個簡單的基於URL的查詢功能(儘管這真是個好主意!) – 2009-08-18 17:30:04

+0

AD有幾種可能的命名屬性。哪一個是用戶名? sAMAccountName,userPrinicipalName,DN,CN等。 – geoffc 2009-08-18 19:09:28

相關問題