【发布时间】:2012-06-13 23:34:52
【问题描述】:
使用 DirectoryEntry 有很多答案,但与 AccountManagement 类无关。
我可以使用 AccountManagement 获取 OU 列表吗?
【问题讨论】:
-
过去我从来没有发现 DirectoryEntry 有帮助,看看这个stackoverflow.com/questions/1437250/…
标签: c# active-directory
使用 DirectoryEntry 有很多答案,但与 AccountManagement 类无关。
我可以使用 AccountManagement 获取 OU 列表吗?
【问题讨论】:
标签: c# active-directory
就个人而言,我认为“DirectoryEntry”可能是要走的路。
但此链接建议您可以使用 PrincipalContext:
Get Groups From OU using DirectoryServices.AccountManagement
【讨论】:
老问题,但我仍然需要解决它,所以我将分享我的发现:您可以将主体对象扩展到任何 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 获得灵感。
【讨论】: