如何使用帐户管理 (C#) 获取 OU 列表

本文关键字:获取 OU 列表 何使用 管理 | 更新日期: 2023-09-27 18:37:01

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

有没有办法使用帐户管理来获取 OU 列表?

如何使用帐户管理 (C#) 获取 OU 列表

就个人而言,我认为"DirectoryEntry"可能是要走的路。

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

使用 DirectoryServices.AccountManagement 从 OU 获取组

老问题 但是,我仍然必须解决它,所以我将分享我的发现: 您可以将主体对象扩展到任何 ActiveDirectory 对象(在 learn.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];
        }            
    }  

我只需要一个 Ous 列表,在"State"属性中有一些东西,所以我需要扩展一个高级过滤器集

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+")");
}

我希望它能帮助某人(或者下次我忘记时我自己......我使用这个 GitHub 存储库来获得灵感。