如何使用AccountManagement(C#)获取OU列表

如何使用AccountManagement(C#)获取OU列表,c#,active-directory,C#,Active Directory,使用DirectoryEntry有许多答案,但与AccountManagement类无关 有没有一种方法可以使用AccountManagement获取OU列表?就我个人而言,我认为“DirectoryEntry”可能是一种方法 但此链接建议您可以使用PrincipalContext: 老问题,但我还是要解决它,所以我将分享我的发现:您可以将主体对象扩展到任何ActiveDirectory对象(在docs.microsoft.com中搜索主体扩展) 例如: [DirectoryRdnPrefix(

使用DirectoryEntry有许多答案,但与AccountManagement类无关

有没有一种方法可以使用AccountManagement获取OU列表?

就我个人而言,我认为“DirectoryEntry”可能是一种方法

但此链接建议您可以使用PrincipalContext:


老问题,但我还是要解决它,所以我将分享我的发现:您可以将主体对象扩展到任何ActiveDirectory对象(在docs.microsoft.com中搜索主体扩展) 例如:

[DirectoryRdnPrefix("OU")]
[DirectoryObjectClass("organizationalUnit")]
public class OuPrincipal : GroupPrincipal
{ 
    public OuPrincipal(PrincipalContext pc) : base(pc)
    {

    }
    OuPrincipalSearchFilter searchFilter;

    public OuPrincipalSearchFilter AdvancedSearchFilter
    {
        get
        {
            if ( null == searchFilter )
                searchFilter = new OuPrincipalSearchFilter(this);

            return searchFilter;
        }
    }
    public object[] GetAttribute(string attribute)
    {
        return (ExtensionGet(attribute));
    }
    [DirectoryProperty("st")]
    public string State
    {
        get
        {
            if (ExtensionGet("st").Length != 1)
                return null;

            return (string)ExtensionGet("st")[0];
        }            
    }  
我只需要一个在“State”属性中包含某些内容的OU列表,因此我需要扩展advancedFilterSet

public class OuPrincipalSearchFilter : AdvancedFilters
    {
        public OuPrincipalSearchFilter(Principal p) : base(p){}    
        public void testState(string value)
        {
            this.AdvancedFilterSet("st", value, typeof(string), MatchType.Equals);
        }
    }
然后:

var test = new OuPrincipal(pc);
test.AdvancedSearchFilter.testState("*");
PrincipalSearcher ps = new PrincipalSearcher(test);
var rslts = ps.FindAll();
foreach(OuPrincipal ou in rslts)
{
    Console.WriteLine("OU "+ou.Name+" : "+ou.State+" ("+ou.Description+")");
}
我希望它能帮助别人(或我自己,下次我忘了…)。
我用它来激发灵感。

过去,我从未发现DirectoryEntry有帮助。看看这个