2

これには DirectoryEntry を使用した回答が多数ありますが、AccountManagement クラスに関連するものはありません。

AccountManagement を使用して OU のリストを取得する方法はありますか?

4

2 に答える 2

1

個人的には、「DirectoryEntry」がおそらく正しい方法だと思います。

ただし、このリンクでは、PrincipalContext を使用できることが示唆されています。

DirectoryServices.AccountManagement を使用して OU からグループを取得する

于 2012-06-13T23:40:03.973 に答える
1

古い質問ですが、それでも解決しなければならなかったので、見つけたものを共有します: プリンシパル オブジェクトを任意の 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」プロパティに何かを含む Ous のリストが必要だったので、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+")");
}

それが誰か(または次回忘れたときに私自身...)に役立つことを願っています. この github リポジトリをインスピレーションに使用しました。

于 2020-02-12T12:03:02.710 に答える