C#使用.NET标准2.0中的自定义属性查询Active Directory
如何使用.NET Standard2.0中的自定义属性查询公司的Active Directory? 例如,如果我想使用给定属性进行查询,我的代码如下所示:C#使用.NET标准2.0中的自定义属性查询Active Directory,c#,active-directory,.net-standard,.net-standard-2.0,userprincipal,C#,Active Directory,.net Standard,.net Standard 2.0,Userprincipal,如何使用.NET Standard2.0中的自定义属性查询公司的Active Directory? 例如,如果我想使用给定属性进行查询,我的代码如下所示: FSharpOption TryGetUser(SecurityIdentifier sid) { 使用(var context=newprincipalcontext(ContextType.Domain)) { var user=UserPrincipal.FindByIdentity(上下文,IdentityType.Sid,Sid.V
FSharpOption TryGetUser(SecurityIdentifier sid)
{
使用(var context=newprincipalcontext(ContextType.Domain))
{
var user=UserPrincipal.FindByIdentity(上下文,IdentityType.Sid,Sid.Value);
if(user==null)
返回FSharpOption.None;
返回FSharpOption.Some(用户);
}
}
现在,我想使用名为
“manager”
的自定义属性进行查询,该属性是一个字符串。我想搜索所有拥有manager==“…”
的用户,您不能使用UserPrincipal
,而PrincipalSearcher
只允许您通过UserPrincipal
公开的属性进行搜索。您必须直接使用(这也是PrincipalSearcher
在幕后使用的)
以下是您将要做的一个示例:
public IEnumerable<string> GetUsersWithManager(string managerDn) {
var search = new DirectorySearcher(new DirectoryEntry()) {
Filter = $"(&(objectClass=user)(manager={managerDn}))"
};
search.PropertiesToLoad.Add("distinguishedName");
using (var results = search.FindAll()) {
foreach (SearchResult result in results) {
if (result.Properties.Contains("mail")) {
yield return (string) result.Properties["distinguishedName"][0];
}
}
}
}
请记住,该属性没有索引。因此,如果这是您唯一的标准(除了(objectClass=user)
),那么AD需要查看每个用户以找到匹配项。在您的环境中,这可能真的很慢,也可能不慢
就个人而言,我更喜欢直接使用
DirectorySearcher
和DirectoryEntry
。我发现整个系统.DirectoryServices.AccountManagement
名称空间非常慢。我写了一篇关于如何直接使用System.DirectoryServices
名称空间来提高性能的文章:我很确定,要做到这一点,您必须创建一个自定义字符串过滤器。它看起来是这样的(&(objectClass=person)(objectClass=user))您实际上可以扩展UserPrincipal类来实现这一点(以及重写Find方法)。请参阅,这样您就可以扩展UserPrincipal类来实现这一点(以及重写Find方法)。如果你愿意的话,请看SO@PBMe\u。但无论如何,使用DirectorySearcher
/DirectoryEntry
总是比PrincipalSearcher
/UserPrincipal
执行得更快。
UserPrincipal.FindByIdentity(context, IdentityType.DistinguishedName, distinguishedName)