DirectoryAccess クラスに追加した組織単位(OU)関連のメソッドのコードです。(前回追加したコードはこちら)
VB
'組織単位(OU)を取得します。
Public Shared Function GetOrganizationalUnits() As IList(Of OrganizationalUnit)
Dim ous As New List(Of OrganizationalUnit)()
If CanConnectDomain Then 'ドメインに接続できる時
Using root = GetRootEntry() 'ルートのDirectoryEntryを取得
Dim filter = String.Format("(objectCategory={0})", CategoryType.OrganizationalUnit)
Using searcher As New DirectorySearcher(root, filter)
Using results = searcher.FindAll()
For Each res As SearchResult In 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(ou As OrganizationalUnit) As List(Of DomainObject)
Dim objects As New List(Of DomainObject)()
Using searcher As New DirectorySearcher(ou.Entry)
searcher.SearchScope = SearchScope.OneLevel
Using results = searcher.FindAll()
For Each res As SearchResult In 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 = new List<OrganizationalUnit>();
if (CanConnectDomain) //ドメインに接続できる時
{
using (var root = GetRootEntry()) //ルートのDirectoryEntryを取得
{
var filter = String.Format("(objectCategory={0})", CategoryType.OrganizationalUnit);
using (var searcher = new DirectorySearcher(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 = new List<DomainObject>();
using (var searcher = new DirectorySearcher(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 なので、指定しないとサブツリー全体を検索することになります。