C# 如何搜索全局目录并返回用户主体列表?

C# 如何搜索全局目录并返回用户主体列表?,c#,active-directory,userprincipal,C#,Active Directory,Userprincipal,我使用以下代码搜索全局目录: public SearchResultCollection SearchGlobalCatalog(string username) { var de = new DirectoryEntry("GC://SERVERNAME", "USERNAME", "PASSWORD"); var ds = new DirectorySearcher(de); ds.Filter = "(&((&(objectCategory=Pers

我使用以下代码搜索全局目录:

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
对象列表。我想这样做的原因是为了访问一些在全局编录中不可用的用户属性,如员工ID。

A
UserPrincipal
System.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();
    }
}

为什么员工ID不可用?它存储在哪里?因为并非所有属性都复制到全局编录。我可以通过使用域的ContextType的PrincipalContext搜索Active Directory来获取员工ID。但是,我不知道如何通过搜索全局目录来访问这些附加属性。我知道。我不是这么问的。我想知道如何从
SearchResultCollection
(使用
DirectorySearcher
对象搜索全局编录的结果)获取
UserPrincipal
对象,或者如何访问未复制到全局编录的所有属性,比如员工ID。你不能从DirectoryEntry获取信息吗?它们将包含相同的属性。但是,一旦找到作为
DirectoryEntry
对象的用户,您应该能够使用
PrincipalContext
搜索Active Directory,以获取该用户的
UserPrincipal
对象。是吗?在这一行:
var rootName=de.Properties[“rootDomainNamingContext”].Value.ToString(),我得到了一个
COMException:Unknown error(0x8000500c)
。如果我像在代码中一样使用
GC://rootDSE
,我不会得到错误。但是,
employeeId
仍然不可用。此外,我不明白如何在不提供路径的情况下以这种方式连接到全局目录。