【发布时间】:2015-11-20 17:33:19
【问题描述】:
我在使用 PrincipalSearcher 时需要分页。我尝试使用底层DirectorySearcher 的VirtualListView 属性无济于事。
示例代码:
using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
using System.Linq;
namespace Testbed
{
internal class Testbed
{
private static void Main(string[] args)
{
Works();
Fails();
Console.ReadKey();
}
private static void Works()
{
var entry = new DirectoryEntry("LDAP://server/DC=example,DC=com", @"USERNAME", "PASSWORD");
var searcher = new DirectorySearcher(entry);
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(cn=*)";
// sort is needed, otherwise DVLV will not work?
searcher.Sort = new SortOption("cn", SortDirection.Ascending);
searcher.VirtualListView = new DirectoryVirtualListView(5, 10, 5);
SearchResultCollection result = searcher.FindAll();
Console.WriteLine("Works: " + result.Count);
}
private static void Fails()
{
var context = new PrincipalContext(ContextType.Domain, "server", "DC=example,DC=com",
ContextOptions.Negotiate,
@"USERNAME", "PASSWORD");
var user = new UserPrincipal(context)
{
DisplayName = null,
};
var searcher = new PrincipalSearcher(user);
((DirectorySearcher) searcher.GetUnderlyingSearcher()).Sort = new SortOption("cn", SortDirection.Ascending);
((DirectorySearcher) searcher.GetUnderlyingSearcher()).VirtualListView = new DirectoryVirtualListView(0, 2, 2);
PrincipalSearchResult<Principal> result = searcher.FindAll();
Console.WriteLine("Fails: " + result.Count());
}
}
}
当我直接使用DirectorySearcher(方法:Works())时,一切正常,但使用PrincipalSearcher(方法:Fails())我得到以下异常(对不起德语文本):
Ausnahmefehler: System.Runtime.InteropServices.COMException: Die angeforderte kritische Erweiterung wird vom Server nicht unterstützt.
bei System.DirectoryServices.SearchResultCollection.ResultsEnumerator.MoveNext()
bei System.DirectoryServices.AccountManagement.ADEntriesSet.MoveNext()
bei System.DirectoryServices.AccountManagement.FindResultEnumerator`1.MoveNext()
bei System.DirectoryServices.AccountManagement.FindResultEnumerator`1.System.Collections.IEnumerator.MoveNext()
bei System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
有什么解决办法吗? PrincipalSearcher 甚至可以做到这一点吗?
【问题讨论】:
标签: c# pagination active-directory