やさしく解説するマイクロソフトの最新技術(第3回)

マイクロソフト株式会社 ソリューションデベロッパー事業部 デベロッパー製品部
テクニカル・エバンジェリスト 熊谷 恒治 kojik@microsoft.com



ADSIについて


 今回は1回目に解説したActive Directoryにも関係するディレクトリアクセスAPIであるADSI(Active Directory Service Interface)について解説していきたいと思います。
ADSIは世に出回っているさまざまなディレクトリサービスに対して統一的なアプリケーションインターフェイスを提供します。現在対応しているものはNT4のドメインデータベース、Exchange 、Active Directory(LDAP)、NetWareバインダリデータベース、NDS等が存在します。この様にさまざまなディレクトリを抽象化する仕組みとしてADSI Service Providerがあり、これは各ディレクトリサービスへのアクセスをサポートします。

図1

図2


この機能により開発者は複数のディレクトリサービスへ単一のAPIからアクセスすることが可能になります。
 ADSIはディレクトリサービスが持っているオブジェクト(ユーザーオブジェクト、プリンタオブジェクト等)に対応するCOMオブジェクトのセットです。各オブジェクトは基本インターフェイスとオブジェクト固有のインターフェイスを持ち、開発者はそれらのインターフェイスを利用してディレクトリ上のオブジェクトのアトリビュート操作(特定ユーザーオブジェクトの電話番号を変更するなど)をやオブジェクトの操作(ユーザーオブジェクトの作成など)を行います。
それではここでADSIが提供している代表的ないくつかのオブジェクトを紹介してみましょう。

・コンテナオブジェクト
ディレクトリサービスのコンテナオブジェクトに対応します。このオブジェクトはIADs、IADsContainerインターフェイスを持っています。

図3


 IADsインターフェイスはADSIオブジェクトの基本インターフェイスですべてのオブジェクトで実装されています。これはGET,PUT,GERINFO,SETINFO等のメソッドを持っておりディレクトリ上のオブジェクトがストアしているプロパティの読み込み、セット、データベースへのコミットなどの操作を行うことでオブジェクトのアトリビュートを操作します。
 IADsContainerはコンテナオブジェクト固有のインターフェイスで、コンテナ配下にあるオブジェクトの操作を行います。こではCREATE,DELETE,COPYHERE,MOVEHEREメソッド等が実装されており、それぞれコンテナ直下のオブジェクト作成、削除、他コンテナからのオブジェクトコピー、移動を行います。
特にオブジェクトの作成、削除などはディレクトリ操作の基本ですからコンテナオブジェクトは多く利用されることになるでしょう。

・ユーザーオブジェクト
ディレクトリサービスのユーザーオブジェクトに対応します。このオブジェクトはIADs,IADsUserインターフェイスを持ち、ユーザーオブジェクトのアトリビュート操作及び参照で利用します。

図4

言い方を変えると特定ユーザーの情報(例えばメールアドレス、住所など)を参照したり、変更したりするために用いるのです。
 IADsインターフェイスはコンテナオブジェクトで説明した通りです。
 IADsUserインターフェイスはユーザー固有のアトリビュートをプロパティとして持っています。これは先に説明した住所、電話番号、メールアドレス等があたります。
この二つのオブジェクト意外にもプリンタオブジェクト、コンピュータオブジェクト、シェアオブジェクトなどさまざまなオブジェクトが存在しますが仕組みは同じです。

さて、次に実際の操作に移ることにしましょう。実際の操作はいくつかのケースを例に解説して行きます。

・アトリビュートの書き込み、変更
 ディレクトリの操作の多くはオブジェクトのアトリビュートを参照したり、変更したりする操作です。これらの操作を行う場合かならず必要なのが対象オブジェクトのバインドです。バインドの次はオブジェクトが保持しているアトリビュートをキャッシュへロードします。ADSIでのデータ操作は直接ディレクトリデータベースを操作するのではなく、常にキャッシュ経由になります。そのためアトリビュートの操作はキャッシュへのロード及び更新後のデータベースへのコミットを行う必要があります。
 このキャッシュへのロード後に、各アトリビュートを参照したり更新を行い、最後に先にのべたコミットを行います。Visual Basicを使った例をお見せしましょう。

Set MyObject = GetObject(“WinNT://NTDomain/KUMAGAI,User”)
オブジェクトのバインドを行っています。WinNTからKUMAGAIまでが操作対象オブジェクト名になります。WinNTの部分が各ディレクトリサービスに対応しておりこれはNT4ドメインになります。第二パラグラフのUserは操作対象オブジェクトのクラスを指定しています。
MyObject.Getinfo
キャッシュへのロードを行っています。
MyObject.Title = “システム管理者”
MyObject.TelephoneNumber = ”03-5454-5454”
各アトリビュートへのデータセットを行っています。ここではユーザーKUMAGAIのタイトルと電話番号を設定しています。
MyObject.Setinfo
キャッシュ上のデータをディレクトリデータベースへ反映しています。

・オブジェクトの作成
 次によく使うのがオブジェクトの作成です。オブジェクトの作成はコンテナオブジェクトのIADsContainerで対応することを先に説明しました。ゆえにオブジェクトの作成などの操作には操作対象オブジェクトの上位コンテナオブジェクトのバインドを行い、その後にIADsConatinerを使い作成、削除を行います。作成の場合は該当オブジェクトのアトリビュート操作が必要ですので先の例のような操作を続けて行うことになります。

Set MyContainer = GetObject(“WinNT://NTDomain”)
作成対象オブジェクトをストアするコンテナオブジェクトのバインドを行います。
Set NewUser = MyContainer.Create(“user”,”YAMADA”)
Createメソッドを使ってusersクラス、オブジェクト名 YAMADAオブジェクトを作成しています。
NewUser.Title = “システム管理者”
NewUser.TelephoneNumber = ”03-5454-5454”
各プロパティーの設定を行っています。
NewUser.SetInfo
ディレクトリデータベースへのコミットを行っています。

 この様な形でADSIオブジェクトを利用することでアプリケーションからディレクトリサービスを操作するわけです。これはVB,VC以外の当然Active Server Pagesから利用することでWebベースでディレクトリデータを操作することもできますし、管理者はWindows Scripting Hostからも利用できます。例えばWSHからExcelとADSIを利用してExcelのシートに登録されたユーザーをディレクトリにバッチ登録したり、逆にディレクトリ上のデータをExcelシートにリストすることも可能になります。
 このようにADSIは広いレベルの開発者にディレクトリへのアクセス環境を提供するインターフェイスであり、ディレクトリ対応アプリケーションの開発そして一般管理者用スクリプトの提供などさまざまな局面で利用する重要なAPIの一つとなることでしょう。


Contents         Windows Consortium ホームページ