- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我看到使用 PrincipalSearcher
的 Active Directory 示例和其他使用 DirectorySearcher
做同样事情的示例。这两个例子有什么区别?
使用 PrincipalSearcher
的示例
PrincipalContext context = new PrincipalContext(ContextType.Domain);
PrincipalSearcher search = new PrincipalSearcher(new UserPrincipal(context));
foreach( UserPrincipal user in search.FindAll() )
{
if( null != user )
Console.WriteLine(user.DistinguishedName);
}
使用 DirectorySearcher
的例子
DirectorySearcher search = new DirectorySearcher("(&(objectClass=user)(objectCategory=person))");
search.PageSize = 1000;
foreach( SearchResult result in search.FindAll() )
{
DirectoryEntry user = result.GetDirectoryEntry();
if( null != user )
Console.WriteLine(user.Properties["distinguishedName"].Value.ToString());
}
最佳答案
我花了很多时间分析这两者之间的区别。这是我学到的。
DirectorySearcher
来自 System.DirectoryServices
命名空间。
PrincipalSearcher
来自 System.DirectoryServices.AccountManagement
命名空间,它建立在 System.DirectoryServices
之上。 PrincipalSearcher
内部使用 DirectorySearcher
。
AccountManagement
命名空间(即 PrincipalSearcher
)旨在简化用户、组和计算机对象(即委托(delegate)人)的管理。从理论上讲,它的用法应该更容易理解,并产生更少的代码行。尽管到目前为止,在我的实践中,它似乎在很大程度上取决于你在做什么。
DirectorySearcher
更底层,可以处理的不仅仅是用户、组和计算机对象。
对于一般用法,当您使用基本属性和少数对象时,PrincipalSearcher
将导致更少的代码行和更快的运行时间。
您正在执行的任务变得越高级,优势似乎就会消失。例如,如果您期望超过几百个结果,则必须获取基础 DirectorySearcher
并设置 PageSize
DirectorySearcher ds = search.GetUnderlyingSearcher() as DirectorySearcher;
if( ds != null )
ds.PageSize = 1000;
PropertiesToLoad
,
DirectorySearcher
可以比 PrincipalSearcher
快得多。
DirectorySearcher
和类似的类可以处理 AD 中的所有对象,而 PrincipalSearcher
的限制要多得多。例如,您不能使用 PrincipalSearcher
和类似类修改组织单位。
这是我使用 PrincipalSearcher
、DirectorySearcher
而不使用 PropertiesToLoad
和 DirectorySearcher
进行分析的图表使用 PropertiesToLoad
。所有测试...
1000
的 PageSize
objectClass=user
objectCategory=person
!msExchResourceMetaData=ResourceType:Room
)!userAccountControl:1.2.840.113556.1.4.803:=2
)
使用 PrincipalSearcher
[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("Person")]
public class UserPrincipalEx: UserPrincipal
{
private AdvancedFiltersEx _advancedFilters;
public UserPrincipalEx( PrincipalContext context ): base(context)
{
this.ExtensionSet("objectCategory","User");
}
public new AdvancedFiltersEx AdvancedSearchFilter
{
get {
if( null == _advancedFilters )
_advancedFilters = new AdvancedFiltersEx(this);
return _advancedFilters;
}
}
}
public class AdvancedFiltersEx: AdvancedFilters
{
public AdvancedFiltersEx( Principal principal ):
base(principal) { }
public void Person()
{
this.AdvancedFilterSet("objectCategory", "person", typeof(string), MatchType.Equals);
this.AdvancedFilterSet("msExchResourceMetaData", "ResourceType:Room", typeof(string), MatchType.NotEquals);
}
}
//...
for( int i = 0; i < 10; i++ )
{
uint count = 0;
Stopwatch timer = Stopwatch.StartNew();
PrincipalContext context = new PrincipalContext(ContextType.Domain);
UserPrincipalEx filter = new UserPrincipalEx(context);
filter.Enabled = true;
filter.AdvancedSearchFilter.Person();
PrincipalSearcher search = new PrincipalSearcher(filter);
DirectorySearcher ds = search.GetUnderlyingSearcher() as DirectorySearcher;
if( ds != null )
ds.PageSize = 1000;
foreach( UserPrincipalEx result in search.FindAll() )
{
string canonicalName = result.CanonicalName;
count++;
}
timer.Stop();
Console.WriteLine("{0}, {1} ms", count, timer.ElapsedMilliseconds);
}
使用DirectorySearcher
for( int i = 0; i < 10; i++ )
{
uint count = 0;
string queryString = "(&(objectClass=user)(objectCategory=person)(!msExchResourceMetaData=ResourceType:Room)(!userAccountControl:1.2.840.113556.1.4.803:=2))";
Stopwatch timer = Stopwatch.StartNew();
DirectoryEntry entry = new DirectoryEntry();
DirectorySearcher search = new DirectorySearcher(entry,queryString);
search.PageSize = 1000;
foreach( SearchResult result in search.FindAll() )
{
DirectoryEntry user = result.GetDirectoryEntry();
if( user != null )
{
user.RefreshCache(new string[]{"canonicalName"});
string canonicalName = user.Properties["canonicalName"].Value.ToString();
count++;
}
}
timer.Stop();
Console.WriteLine("{0}, {1} ms", count, timer.ElapsedMilliseconds);
}
使用 DirectorySearcher
和 PropertiesToLoad
与“使用 DirectorySearcher
相同,但添加此行
search.PropertiesToLoad.AddRange(new string[] { "canonicalName" });
之后
search.PageSize = 1000;
关于c# - PrincipalSearcher 和 DirectorySearcher 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23176284/
我在使用 PrincipalSearcher 时需要分页。我尝试使用底层 DirectorySearcher 的 VirtualListView 属性,但没有成功。 示例代码: using Syste
我希望能够查询事件目录,给出包含某些词的所有组的列表,例如下面的用户或管理员,这是我到目前为止所得到的 PrincipalContext ctx = new PrincipalContext(Cont
我有一个为人们分配用户名的网络服务。在内部,我调用了一系列函数来验证 AD 中是否存在跨 UserPrincipal、samAccountName、proxyaddresses 和 email 字段的
是否可以通过单个 PrincipalSearcher 调用搜索多个用户名。也许通过提供请求的用户名的“OR”作为过滤条件? 最佳答案 是的,可以使用简单的 LDAP 查询来搜索多个用户名。我不确定您到
我也有一个使用插件和应用程序域的长期运行服务,并且由于使用目录服务而导致内存泄漏。请注意,我使用的是 system.directoryservices.accountmanagement,但据我了解,
我正在尝试在未设置属性的 AD LDS (ADAM) 实例中搜索用户,例如,“公司”属性未设置为 ADAM 存储(或 AD 中的值)事)。 当我将 PrincipalSearcher 和自定义 Use
是否可以使用 System.DirectoryServices.AccountManagement.PrincipalSearcher 使用“或”(而不是“和”)基于多个参数进行搜索。 即 // Th
我看到使用 PrincipalSearcher 的 Active Directory 示例和其他使用 DirectorySearcher 做同样事情的示例。这两个例子有什么区别? 使用 Princip
如何防止在对具有子容器(子 OU)的特定 OU 的查询中使用子容器对象? 澄清一下,我不想在结果集中包含子 OU(子容器)中的用户对象。 给定类似于 another stackoverflow pos
我有以下代码返回一个 UserPrincipal 但登录名从不包含域名。也没有“域名”或类似属性。 我如何从 UserPrincipal 或 PrincipalSearcher 获取用户/返回用户的域
在构建过滤器以查找具有特定值的对象时,Principal Searcher 似乎做得很好。没有呢?例如,我如何构建一个过滤器来排除名字中带有“Joe”的所有人。下面的代码将不起作用。
我们的应用程序有一个从 Active Directory 中获取所有用户并使用他们的信息更新相关 SQL 表的过程。晚上的过程,它是几年前写的——所以它是有效的遗留代码,“如果它没有被破坏,就不要修复
我在使用这段代码时遇到了一些困难,尤其是在使用 PrincipalSearcher 时。我正在尝试获取与特定 OU 关联的所有组的列表。 我试图只返回所有组范围下的“安全”组,不包括通讯组。 我遇到的
我在 C# 中查询 Active Directory 时遇到奇怪的问题。 var ctx = new PrincipalContext(ContextType.Domain, "adr", "usr"
我有以下代码来检索当前的事件目录用户: public List GetADUsers(string term=null) { List results = new List(); st
尝试在 Active Directory 中搜索有关用户的非空描述(意味着他们有职位),如下面第 4 行所示,但出现无法使用排除项的错误! 关于另一种方法的建议? PrincipalContext c
我只是好奇: List ADUsers = new List(); using (PrincipalContext principle_context = new PrincipalContext(C
我是一名优秀的程序员,十分优秀!