Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用.NET标准2.0中的自定义属性查询Active Directory_C#_Active Directory_.net Standard_.net Standard 2.0_Userprincipal - Fatal编程技术网

C#使用.NET标准2.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

如何使用.NET Standard2.0中的自定义属性查询公司的Active Directory? 例如,如果我想使用给定属性进行查询,我的代码如下所示:

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)