2013-12-18 57 views
1

我用下面的代碼來搜索全局編錄:現在如何搜索全局目錄並返回UserPrincipals的列表?

public SearchResultCollection SearchGlobalCatalog(string username) 
{ 
    var de = new DirectoryEntry("GC://SERVERNAME", "USERNAME", "PASSWORD"); 
    var ds = new DirectorySearcher(de); 
    ds.Filter = "(&((&(objectCategory=Person)(objectClass=User)))(samaccountname=" + username + "*))"; 
    ds.SearchScope = SearchScope.Subtree;     
    var searchResults = ds.FindAll(); 

    return searchResults; 
} 

,問題是我不知道如何從SearchResultCollection獲得UserPrincipal對象的列表。我想這樣做的原因是爲了訪問全局編錄中不可用的某些用戶屬性,如員工編號。

+0

爲什麼僱員ID不可用?它存儲在哪裏? –

+0

因爲並非所有屬性都被複制到全局編錄中。通過使用具有域的ContextType的PrincipalContext搜索Active Directory,我可以獲得Employee ID。但是,我不知道如何通過搜索全局編錄來訪問這些附加屬性。 – ataravati

回答

1

A UserPrincipalSystem.DirectoryServices.AccountManagement命名空間的一部分。

使用該名稱空間中的助手類來獲取UserPrincipal對象。

,不使用UserPrincipal嘗試這樣:

using (var userBinding = new DirectoryEntry("LDAP://domain.forest.company.com")) 
{ 
    using (DirectorySearcher adSearch = new DirectorySearcher(userBinding)) 
    { 
     adSearch.ReferralChasing = ReferralChasingOption.All; 
     adSearch.Filter = "(&((&(objectCategory=Person)(objectClass=User)))(samaccountname=" + username + "*))"; 
     adSearch.PropertiesToLoad.Add("employeeID"); 
     adSearch.PropertiesToLoad.Add("givenname"); 
     adSearch.PropertiesToLoad.Add("samaccountname"); 

     var result = adSearch.FindOne(); 

     var employeeId = result.Properties["employeeID"][0].ToString(); 
    } 
} 
+0

我知道。這不是我問的。我想知道如何從'SearchResultCollection'(通過使用'DirectorySearcher'對象搜索全局編錄的結果)獲得'UserPrincipal'對象,或者訪問所有不復制到全局編錄的屬性,像員工ID。 – ataravati

+0

您無法從DirectoryEntry獲取信息?它們將包含相同的屬性。 –

+0

但是,一旦您找到用戶爲「DirectoryEntry」對象,您應該能夠使用「PrincipalContext」搜索Active Directory以獲取該用戶的UserPrincipal對象。這不正確嗎? – ataravati