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。AUserPrincipal
是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
仍然不可用。此外,我不明白如何在不提供路径的情况下以这种方式连接到全局目录。