Quantcast
Channel: わんくま同盟
Viewing all articles
Browse latest Browse all 994

DirectoryAccessクラスに追加した組織単位(OU)関連のメソッド

$
0
0

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 なので、指定しないとサブツリー全体を検索することになります。


Viewing all articles
Browse latest Browse all 994

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>