DirectoryAccess クラスに追加した組織単位(OU)関連のメソッドのコードです。(前回追加したコードはこちら)
VB
'組織単位(OU)を取得します。
Public Shared Function GetOrganizationalUnits() AsIList(OfOrganizationalUnit)
Dim ous As NewList(OfOrganizationalUnit)()
If CanConnectDomain Then 'ドメインに接続できる時
Using root = GetRootEntry() 'ルートのDirectoryEntryを取得
Dim filter = String.Format("(objectCategory={0})", CategoryType.OrganizationalUnit)
Using searcher As NewDirectorySearcher(root, filter)
Using results = searcher.FindAll()
For Each res AsSearchResultIn results
ous.Add(DirectCast(CreateInstance(res.GetDirectoryEntry()), OrganizationalUnit))
Next
End Using
End Using
End Using
End If
Return ous
End Function
'指定した組織単位直下のオブジェクトを取得します。
Friend Shared Function GetStoredDomainObjects(ouAsOrganizationalUnit) AsList(OfDomainObject)
Dim objects As NewList(OfDomainObject)()
Using searcher As NewDirectorySearcher(ou.Entry)
searcher.SearchScope = SearchScope.OneLevel
Using results = searcher.FindAll()
For Each res AsSearchResultIn results
objects.Add(DirectCast(CreateInstance(res.GetDirectoryEntry()), DomainObject))
Next
End Using
End Using
Return objects.OrderBy(Function(o) o.Name).ToList()
End Function
C#
//組織単位(OU)を取得します。
public static IList<OrganizationalUnit> GetOrganizationalUnits()
{
var ous = newList<OrganizationalUnit>();
if (CanConnectDomain) //ドメインに接続できる時
{
using (var root = GetRootEntry()) //ルートのDirectoryEntryを取得
{
var filter = String.Format("(objectCategory={0})", CategoryType.OrganizationalUnit);
using (var searcher = newDirectorySearcher(root, filter))
{
using (var results = searcher.FindAll())
{
foreach (SearchResult res in results)
{
ous.Add((OrganizationalUnit)CreateInstance(res.GetDirectoryEntry()));
}
}
}
}
}
return ous;
}
//指定した組織単位直下のオブジェクトを取得します。
internal static List<DomainObject> GetStoredDomainObjects(OrganizationalUnit ou)
{
var objects = newList<DomainObject>();
using (var searcher = newDirectorySearcher(ou.Entry))
{
searcher.SearchScope = SearchScope.OneLevel;
using (var results = searcher.FindAll())
{
foreach (SearchResult res in results)
{
objects.Add((DomainObject)CreateInstance(res.GetDirectoryEntry()));
}
}
}
return objects.OrderBy(o => o.Name).ToList();
}
GetStoredDomainObjects メソッドは OrganizationalUnitクラス(VB, C#, 説明)から呼び出されるだけなので内部メソッドにしてます。
メソッド内部の検索については GetOrganizationalUnits メソッドやこれまでの Get~s メソッドと較べて 2つの違いがあります。
1 つは DirectorySearcherコンストラクタ パラメータです。
GetOrganizationalUnits メソッドはドメイン全体で OU を検索するため、検索のルートとなるドメインの DirectoryEntryと検索対象を指定するフィルタ文字列を指定してますが、GetStoredDomainObjects メソッドは その OU 直下のすべてのオブジェクトを検索するので、検索のルートとなる OU の DirectoryEntryを指定してるだけです。
もう 1 つは DirectorySearcher.SearchScope プロパティを指定してることです。
SearchScope.OneLevel を指定することで検索を直下だけにすることができます。
SearchScope プロパティの既定値は SearchScope.Subtree なので、指定しないとサブツリー全体を検索することになります。