2013-12-18 35 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