【问题标题】:How to get list of OU using AccountManagement (C#)如何使用 AccountManagement (C#) 获取 OU 列表
【发布时间】:2012-06-13 23:34:52
【问题描述】:

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

我可以使用 AccountManagement 获取 OU 列表吗?

【问题讨论】:

标签: c# active-directory


【解决方案1】:

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

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

Get Groups From OU using DirectoryServices.AccountManagement

【讨论】:

    【解决方案2】:

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

    我只需要一个 Ous 列表,其中包含“State”属性中的某些内容,因此我需要扩展一个 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+")");
    }
    

    我希望它可以帮助某人(或者下次我忘记时我自己......)。 我使用this github repository 获得灵感。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多