(57)【特許請求の範囲】
【請求項１】
コンピュータシステムにおいて、所定のインタフェースが、複数のディレクトリサービスプロバイダーにより提供される複数のディレクトリサービスにオブジェクト・属性・インタフェースの共通セットを用いてアクセスする方法であって、
前記コンピュータシステムにおけるディレクトリサービスプロバイダーのクライアントプログラムは、前記オブジェクト・属性・インタフェースの共通セットを用いてアプリケーションプログラミングインタフェースを備えた様々な各ディレクトリサービスにアクセスして、ディレクトリサービスのオブジェクトにアクセスし、そして、
少なくとも２つの前記ディレクトリサービスプロバイダーが、異なるアプリケーションプログラミングインタフェースを有しながら類似の機能性をもつ少なくとも１つのディレクトリサービス機能を提供するように構成されており、
前記コンピュータシステムは、
前記複数のディレクトリサービスプロバイダーの各々のために、前記オブジェクト・属性・インタフェースの共通セットを用いて、前記何れかのディレクトリサービスのオブジェクトにアクセスするための関数の定義を含む前記所定のインタフェースの実装をインストールする処理と、この際に、前記所定のインタフェースの実装は、あるディレクトリサービスプロバイダーにおける前記アプリケーションプログラミングインタフェースの機能から、前記所定のインタフェースの機能へのマッピングを与え、
前記オブジェクトに関係する情報を含むディレクトリサービスを特定するとともに、当該特定されたディレクトリサービス内のオブジェクトへのパス(path)を特定するためのオブジェクトの識別（特定）を、ディレクトリサービスプロバイダーのクライアントプログラムから受信する処理と、
前記特定されたディレクトリサービスを使用することにより、前記識別されたオブジェクトがどのディレクトリサービスプロバイダーから提供されるかを決定する処理と、
前記決定されたディレクトリサービスプロバイダーのためにインストールされた、前記所定のインタフェースの実装と前記特定されたパスとを使用して、前記識別されたオブジェクトに対する前記所定のインタフェースの対応オブジェクトを探し出し結びつける処理と、
を含み、これにより、
前記ディレクトリサービスプロバイダーのクライアントプログラムは、そのディレクトリサービスに関する所定のインタフェースの実装を用いて、各ディレクトリサービスにアクセスすることができることを特徴とする方法。
【請求項２】
前記各オブジェクトはオブジェクトクラスを有し、前記所定のインタフェースは、前記所定のインタフェースのデフォルト(default)・オブジェクトのインスタンスを実装することによって、オブジェクトクラスの定義をディレクトリサービスに追加するための関数の定義を含む、請求項１に記載の方法。
【請求項３】
前記各オブジェクトはオブジェクトクラスを有し、所定のインタフェースはディレクトリサービスのオブジェクトクラスの定義を検索するための関数の定義を含む、請求項１に記載の方法。
【請求項４】
前記所定のインタフェースは、前記ディレクトリサービスに対してオブジェクトへの変更を完追するための関数の定義を含む、請求項１に記載の方法。
【請求項５】
コンピュータシステムに所定のインタフェースを提供し、複数のディレクトリサービスプロバイダーが提供する複数のディレクトリサービスにアクセスするように機能させるプログラムを記録したコンピュータ読取り可能な記録媒体であって、
前記各ディレクトリサービスは、オブジェクト・属性・インタフェースの共通セットを用いて前記ディレクトリサービスのオブジェクトにアクセスするための関数の定義を含む前記アプリケーションプログラミングインタフェースを有し、前記所定のインタフェースを用いるために開発されたクライアントプログラムが、前記オブジェクト・属性・インタフェースの共通セットを用いて前記ディレクトリサービスの各々にアクセスできるよう構成されており、
これにより、前記コンピュータシステムに、
複数のディレクトリサービスプロバイダーの各々のために前記所定のインタフェースの実装をインストールする処理であって、前記オブジェクト・属性・インタフェースの共通セットを用いて前記何れかのディレクトリサービスのオブジェクトにアクセスする関数が前記所定のインタフェースによって定義され、前記実装によって前記アプリケーションプログラミングインタフェースの機能から、前記所定のインタフェースの対応の機能へのマッピングが与えられる、当該処理と、
前記オブジェクトに関係する情報を含むディレクトリサービスを特定するとともに、当該特定されたディレクトリサービス内のオブジェクトへのパス(path)を特定するためのオブジェクトの識別を受信する処理と、
前記オブジェクトの識別を使用して前記特定されたディレクトリサービスを識別する処理と、
前記特定されたパスを前記オブジェクトに渡すことによって、前記識別されたディレクトリサービスの所定のインタフェース実装への対応の関数を呼び出す処理と、その呼び出された関数は前記オブジェクトの参照（リファレンス）を返し、
前記オブジェクトに関係する情報が得られるようにするため、前記呼び出された関数と前記参照を結びつける処理と、
を実行させるためのプログラムを記録したコンピュータ読取り可能な記録媒体。
【請求項６】
前記各オブジェクトはオブジェクトクラスを有し、前記所定のインタフェースは、前記所定のインタフェースのデフォルト(default)・オブジェクトを実装することによって、オブジェクトクラスの定義をディレクトリサービスに追加するための関数の定義を含む、ことを特徴とする請求項５に記載のコンピュータ読取り可能な記録媒体。
【請求項７】
前記各オブジェクトはオブジェクトクラスを有し、前記所定のインタフェースは、ディレクトリサービスのオブジェクトクラスの定義を検索するための関数の定義を含む、ことを特徴とする請求項５に記載のコンピュータ読取り可能な記録媒体。
【請求項８】
前記所定のインタフェースは、前記ディレクトリサービスに対してオブジェクトへの変更を完追するための関数の定義を含む、ことを特徴とする請求項５に記載のコンピュータ読取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明はコンピュータベースのディレクトリサービスに関し、特に、ディレクトリサービスに同じようにアクセスするための方法及びシステムに関する。
【０００２】
【従来の技術】
コンピュータシステムは一般的には、コンピュータシステム及びそのユーザに関する多量のデータをストアし且つ保持する。例えば、コンピュータシステムはコンピュータシステムのユーザの名前、電子メールアドレス、及び、電話番号を保持する。コンピュータシステムはまた、コンピュータシステムに接続された種々のプリンタに関する情報も保持する。この情報は、プリンタ特性（例えば、レーザ及びカラー）及び各プリンタを使用するのに許可された使用者の名前を含む。「クライアント」として知られる種々の異なるタイプのコンピュータプログラムは、この情報にアクセスする必要がある。例えば、あるクライアントは、プリンタが書類をカラーでプリントするのに使用されることができることを判断するのに必要であるコンピュータプログラムであってよい。別のクライアントは、例えば、新しく追加されたプリンタに関する情報を反映するように、システム管理者が情報を更新することができるコンピュータプログラムであってよい。コンピュータシステムは、伝統的には、かかる情報を様々な位置及びフォーマットにストアしてきた。例えば、プリンタに関する情報はコンフィギュレーションファイルにストアされ、ユーザに関する情報はデータベースにストアされたりする。従って、一般的には、クライアントを開発するプログラマはこの情報にアクセスする仕方を知ることはもちろんとして、この情報を探すための場所を知ることさえ困難であった。
【０００３】
あるコンピュータシステムは、この情報をストアし且つ保持するのに有用なディレクトリサービスを提供する。ディレクトリサービスは、クライアントがネットワークにアクセス可能な情報のリポジトリを提供する。一般的には、ディレクトリサービスは、情報が「オブジェクト」として保持されているもの（例えば、ユーザ、プリンタ、又は、アクセスグループ）を参照する。ディレクトリサービスは、このようなオブジェクトの階層をディレクトリに構成する。即ち、コンテナオブジェクトと呼ばれるあるオブジェクトは、コンテナに格納されたオブジェクトを参照する他の種々のオブジェクトを包含する。例えば、共通アクセス権をリソースに対して共有するユーザを含むアクセスグループは、コンテナに格納されたオブジェクトのユーザを包含するコンテナオブジェクトである。ディレクトリサービスが情報を保持する各オブジェクトは、クライアントがオブジェクトを識別することができる固有の識別子（例えば、名前）を有する。ディレクトリサービスは、元々は、コンピュータシステムに関する情報を保持するように開発されたのだが、コンピュータシステムと関係が無い情報を保持するのに使用することもできる。例えば、飛行機の構成要素及びサブコンポーネントのための部品リストを保持するために、飛行機製造業者がディレクトリサービスを使用することができる。
【０００４】
図１はディレクトリサービスの階層構造を表す一例である。各ブロックは特定の「オブジェクトクラス」のオブジェクトを表わす。例えば、会社を表わすオブジェクトは、「会社（Company)」と名付けられたオブジェクトクラスを有する。各オブジェクトクラスは、そのオブジェクトクラスのオブジェクトプロパティ(property)を定義する。例えば、前記会社オブジェクトクラスは、プロパティとして「名前」及び「住所」を定義することができる。各オブジェクトは、オブジェクトクラスのために定義された各プロパティに関するプロパティ値を有する。例えば、会社オブジェクトクラスのオブジェクトは、名前のプロパティのために、プロパティ値「ＭＳ」を有することができる。ブロック101 は会社オブジェクトクラスのオブジェクトに対応し、名前及び住所のプロパティに関する値を有する。ブロック102 は、部門オブジェクトクラスのオブジェクトに対応し、部門の名前（例えば、「システム（System) 」）に関する値を有する。ブロック103 はユーザオブジェクトクラスのオブジェクトに対応し、ユーザの電子メールアドレスに関する値を有する。ディレクトリサービスは階層的に構成されているので、ルート(root)からオブジェクトまでのパス(path)情報によって、各オブジェクトを一意的に識別することができる。例えば、オブジェクト102 は、パス「Company=MS＼Division=Systems」によって一意的に識別される。ディレクトリサービスは、ネームスペース（namespace ）と呼ばれる概念的な有限空間を提供し、任意の名前を解読することができる。ディレクトリサービスは、ディレクトリのオブジェクトに対するパスを明瞭に解読する。
【０００５】
種々のベンダは、ディレクトリサービスシステムを提供する。典型的には、各ベンダは、クライアントがそのディレクトリサービスにアクセスすることを可能にするために、アプリケーションプログラミングインターフェース（ＡＰＩ）を設計し且つインプリメント（実装）する。したがって、各ディレクトリサービスシステムは、非常に異なるＡＰＩセット（集合）を有しており、且つ、そのようなＡＰＩセットを有するのが一般的である。クライアントが異なるディレクトリサービスシステムを使用する必要がある場合、例えば、クライアントはパーソナルコンピュータ及びメインフレームコンピュータを含む環境で作動するので、クライアントのプログラマは、各ディレクトリサービスのＡＰＩセットについて知っておく必要があり、ＡＰＩセットの各々をサポートするようにクライアントを設計する必要がある。
【０００６】
各ＡＰＩセットはベンダ固有であるけれども、一般的にはＡＰＩセットは類似した機能性を提供する。一般的には、ＡＰＩセットは、オブジェクトのプロパティ値にアクセスするためのファンクション（関数）と、新しいオブジェクトクラスを定義するためのファンクションとを含む。オブジェクトを処理するファンクションは、例えば、OpenObject、ReadObject、WriteObject 、ListObject、CloseObject 、CreateObject及びDereteObjectである。オブジェクトに対する識別（例えば、パス情報）がファンクションOpenObjectに渡され、ファンクションOpenObjectは、そのオブジェクトを識別するハンドル(handle)をリターンする。その後、このハンドルはクライアントによって使用されることで、ディレクトリサービスに対するオープンオブジェクトを識別する。ファンクションOpenObjectはオブジェクトを識別するために識別を使用し、次いで、識別されたオブジェクトのプロパティを見つけ出す。オープンオブジェクト、及び、検索されるべきそのオブジェクトのプロパティの名前リストへのハンドルが、ファンクションReadObjectにパスされる。ファンクションReadObjectは、それらのプロパティに関する現在のプロパティ値をリターンする。オープンオブジェクトと、プロパティ名及びプロパティ値の組のリストへのハンドルが、ファンクションWriteObject にパスされる。ファンクションWriteObject は、前記組のプロパティ値に対するオープンオブジェクトにおいて名付けられた各プロパティを設定する。オープンオブジェクトへのハンドルがファンクションListObjectに渡され、ファンクションListObjectはオープンオブジェクト内に格納された各オブジェクトの識別を有するリストをリターンする。オープンオブジェクトへのハンドルがファンクションCloseObject に渡され、そのハンドルでもはやアクセスすることができないようにするため、ファンクションCloseObject はオブジェクトを閉じる。オブジェクトクラスがファンクションCreateObjectに渡され、ファンクションCreateObjectは、オープンオブジェクト内に格納されているオブジェクトクラスのオブジェクトを作り、ハンドルをコンテナに格納されたオブジェクトにリターンする。オープンオブジェクトへのハンドルがファンクションDeleteObjectに渡され、ファンクションDeleteObjectは、オープンオブジェクトをそのコンテナオブジェクトから除去する。
【０００７】
オブジェクトクラスを定義するためのファンクションは、CreateObjectClass 、DeleteObjectClass 、CreateProperty、DeleteProperty、AddPropertyToObjectClass、DeletePropertyFromObjectClass 、及びListPropertiesOfObjectClass である。新しいオブジェクトクラスの名前がファンクションCreateObjectClass に渡され、ファンクションCreateObjectClass は新しいオブジェクトクラスを作る。いったんオブジェクトクラスが作られたら、次にクライアントはそのオブジェクトクラスのオブジェクトを作ることができる。プロパティの名前及びプロパティタイプ（例えば、整数又は列）がファンクションCreatePropertyに渡され、ファンクションCreatePropertyはそのプロパティタイプ（例えば、「文字列」のプロパティタイプを有する「住所」のプロパティ名）のプロパティを作る。オブジェクトクラスの名前及びプロパティの名前がファンクションAddPropertyToObjectClassに渡され、ファンクションAddPropertyToObjectClassは名付けられたオブジェクトクラスのプロパティとして、ネーミングされたプロパティを加える。オブジェクトクラスの名前がファンクションListPropertiesOfObjectClass に渡され、ファンクションListPropertiesOfObjectClass はそのオブジェクトクラスに加えられているプロパティのリストをリターンする。ファンクションDeleteObjectClass 、DeleteProperty、及びDeletePropertyFromObjectClass は、それらの名前によって示される動作を行う。
【０００８】
後述するように、本発明はオブジェクト指向技術を使用し、従って、周知のオブジェクト指向プログラミング技術の概略を提供するものである。（「オブジェクト」という用語は、異なる文脈において使用された場合、多くの異なる意味を有する。そこで、この従来技術の以降の説明においては、「オブジェクト」という用語を、インメモリデータ構造に言及するために、オブジェクト指向の意味において使用されるものとする。）オブジェクト指向プログラミング言語において共通する２つの特徴は、データ隠蔽と、データ型の承継に関するサポートである。データ隠蔽は、ファンクション（関数）とデータを結びつけることを指す。承継は、他のデータ型があることから、データ型を宣言することができることを指す。Ｃ++言語では、これらデータ隠蔽及び承継がクラスの使用を介してサポートされるものである。クラスは、ユーザ定義による型である。クラス宣言は、クラスのデータメンバ及びファンクション（関数）メンバを記述する。ファンクションメンバはまた、クラスのメソッドとして示される。クラスのデータメンバとファンクションメンバとは、そのファンクションがクラスのインスタンスで機能するように一緒に結びつけられる。クラスのインスタンスはまた、クラスのオブジェクトと称される。したがって、クラスは、類似のプロパティと共通の処理動作を有するオブジェクトのグループのための定義を提供するものである。
【０００９】
特定の型のオブジェクト（クラス）のための記憶領域を割り当てるために、オブジェクトがインスタンスされる。ひとたびインスタンスされると、特定のオブジェクトのデータメンバに対するデータを指定することができる。また、ひとたびインスタンスされると、特定のオブジェクトのファンクションメンバがアクセスのために呼び出され、そしてデータメンバを操作する。その結果、このやり方の場合、ファンクションメンバは、オブジェクトの処理動作をインプリメント（実装）し、そしてオブジェクトはデータ及び処理動作を単一のエンティティ(entity)に隠蔽するための構造を提供する。
承継のコンセプトをサポートするために、クラスは（他のクラスの宣言に基づいて）他のクラスから派生される。派生クラスとは、その基本クラスの特徴（データメンバ及びファンクションメンバ）を承継するクラスである。別のクラスの特徴を承継するクラスが派生クラスである。別のクラスの特徴を承継しないクラスがプライマリ（ルート）クラスであり、その特徴が別のクラスによって承継されるクラスが基本クラスである。派生クラスは種々のクラスの特徴を承継することができる。即ち、派生クラスは幾つかの基本クラスを有しても良い。
【００１０】
クラスはまた、そのファンクションメンバがバーチャル(virtual)であるかどうかを指定することができる。ファンクションメンバがバーチャルであると宣言されると、派生クラスにおいて同じ名前及び同じ型のファンクションによってそのファンクションがオーバーライド(override)されることを意味する。バーチャルファンクションがインプリメンテーション（実装）を提供することなく宣言されるならば、そのバーチャルファンクションは ピュア（純粋)バーチャルファンクションとして参照される。ピュアバーチャルファンクションは、ピュア指定子(pure specifier)「＝０」で宣言されたバーチャルファンクションである。仮にクラスがピュアバーチャルファンクションを指定するならば、ファンクションメンバが呼び出される前に、いかなる派生クラスもそのファンクションメンバのためにインプリメンテーション（実装）を指定する必要がある。少なくとも１つのピュアバーチャルファンクションメンバを含むクラスが、アブストラクトクラス（抽象クラス）である。
【００１１】
図２は、オブジェクトを表わすのに使用される典型的なデータ構造を図示したブロック図である。オブジェクトは、オブジェクトの処理動作を実装するインスタンスデータ（データメンバ）及びファンクションメンバをもつ。オブジェクトを表わすのに使用されるデータ構造は、インスタンスデータ構造201 と、バーチャルファンクションテーブル202 と、ファンクションメンバ203,204,205 を含む。インスタンスデータ構造201 は、バーチャルファンクションテーブル202に対するポインタ及びデータメンバを含む。バーチャルファンクションテーブル202 は、オブジェクトのために定義された各バーチャルファンクションメンバに関するエントリを含む。各エントリは、対応するファンクションメンバをインプリメントするコードへのリフェレンス（参照）を含む。このサンプルオブジェクトのレイアウトは、本願に組み入れられた「オブジェクト指向プログラミング言語に関するコンパイラにおけるバーチャルファンクション及びバーチャルベースをインプリメントするための方法」と題する、米国特許第5,297,284 号に説明されたモデルに一致する。以下の説明では、Ｃ++プログラミング言語によって定義されるクラスのインスタンスとしてオブジェクトを説明する。当業者であれば、他のオブジェクトモデルが他のプログラミング言語を使用して定義され得ることは明らかであろう。
【００１２】
オブジェクト指向技術を用いることの利点は、これらの技術がオブジェクトの共有を容易にするために使用できることである。例えば、例示されたオブジェクトのファンクションメンバ（「サーバプログラム」）をインプリメント（実装）するプログラムは、別のプログラム（「クライアントプログラム」）とオブジェクトを共有することができる。任意のクラスのオブジェクトがクライアントプログラムで共有されようにするため、クライアントプログラムを必要とすることなくオブジェクトにアクセスできるインタフェースを定義する。そして、コンパイル時点でそのクラス定義にアクセスする。インターフェースは、論理的に関連したファンクションメンバの集合である。Ｃ++の場合、インターフェースはデータメンバを有しないアブストラクトクラスであり、そしてそのバーチャルファンクションは全てピュアである。したがって、インターフェースは２つのプログラムが通信するための公開プロトコルを提供する。インターフェースは、典型的には派生のために使用される。即ち、プログラムは、クラスを派生させるインターフェースのためのインプリメンテーション（実装）を提供するクラスを定義（インプリメント）する。その後、オブジェクトはこれらの派生クラスのインスタンスとして作られる。特定のインターフェースをインプリメントする派生クラスからインスタンスされたオブジェクトは、インターフェースを「サポート」すると言う。オブジェクトは、所望の機能に依存する１又はそれ以上のインターフェースをサポートする。
【００１３】
クライアントプログラムがオブジェクトを共有することを望む場合、クライアントプログラムはオブジェクト（派生クラスコード）のためのインターフェースをインプリメントするコードにアクセスする必要がある。ワシントン州レッドモンドのマイクロソフトコーポレーションによって確立されたＯＬＥ2.01環境では、派生クラスコード（または、クラスコードとして称する。）にアクセスするために、各クラスのインプリメンテーションは、固有のクラス識別子（「CLSID 」）が与えられる。ＯＬＥ2.01は、『インサイドＯＬＥ』第２版（マイクロソフト発行、1995年、Kraig Brockschmidt著）に記述されている。例えば、マイクロソフトコーポレーションによって開発されたスプレッドシートオブジェクトをインプリメントするコードは、「MSSpreadsheet 」というクラス識別子を有するのに対して、別の会社によって開発されたスプレッドシートオブジェクトをインプリメントするコードは、「LTSSpreadsheet」というクラス識別子を有する。各コンピュータシステムの保存性レジストリは、クラスをインプリメントするコードに各CLSID をマップするということを保持する。典型的には、スプレッドシートプログラムがコンピュータシステムにインストールされたとき、保存性レジストリは、スプレッドシートオブジェクトのそのクラスの使用可能性を反映するために更新される。スプレッドシート開発者がスプレッドシートオブジェクトによってサポートされるべきインターフェースによって定義された各ファンクションメンバをインプリメントする限り、及び、保存性レジストリが保持されている限り、クライアントプログラムは、共有されたスプレッドシートオブジェクトのファンクションメンバにアクセスすることができ、この場合、サーバプログラムはファンクションメンバをインプリメントしたか、或いはどのようにしてインプリメントされているかが考慮されなくてよい。
【００１４】
オブジェクトはあるインターフェースをサポートし、他のインターフェースをサポートしないので、クライアントプログラムは、特定のオブジェクトが特定のインターフェースをサポートするかどうかを実行時に判断する必要がある。この判断を可能にするために、全てのCOM オブジェクトは、ファンクションメンバを含むIUnknownインターフェースと、オブジェクトのためにどのインタフェースがインプリメントされたかを指示するQueryInterfaceとをサポートする。QueryInterfaceメソッドは以下のように定義される：
virtual HRESULT QueryInterface(REFID iid, void**ppv)=0;
（REFID 型の）パラメータiid におけるインターフェース識別子がQueryInterfaceメソッドに渡され、QueryInterfaceメソッドは、パラメータppv においてポインタを指定されたインターフェース「iid 」のインプリメンテーションにリターンする。したがって、QueryInterfaceメソッドは、典型的には、それが属するオブジェクトの使用可能な全てのインターフェースについて知るためにコード化される。オブジェクトがそのインターフェースをサポートしないならば、QueryInterfaceメソッドは偽をリターンする。タイプHRESULT は、所定のステータスを示す。
【００１５】
IUnknownインターフェースはまた、メソッドAddRef及びRelease を定義し、そのメソッドはリファレンスカウントをインプリメントするのに使用される。インターフェースに対して新しいリファレンスが作られるときはいつでも、AddRefメソッドはオブジェクトのリファレンス（参照）カウントを増加させるために呼び出される。リファレンスがもはや必要とされないとき、Release メソッドがオブジェクトのリファレンスカウントを減少させるために呼び出され、そしてリファレンスカウントがゼロに至るとき、オブジェクトは開放される。
【００１６】
【課題を解決するための手段】
本発明はＯＬＥインターフェースに関する定義と、複数のディレクトリサービスに同じようにアクセスすることができるプロバイダソフトウェアのためのモデルとを提供する。各ディレクトリサービスプロバイダは、そのディレクトリサービスのオブジェクトに関する情報を管理する。ディレクトリサービスがオブジェクトのために管理する情報のタイプは、そのオブジェクトのオブジェクトクラスによって定義される。オブジェクトクラスは、ディレクトリサービスがそのオブジェクトクラスのオブジェクトのために管理するプロパティ（即ち、情報）を定義する。各プロパティは、プロパティ名とプロパティタイプを有する。ディレクトリサービスは、各オブジェクトのオブジェクトクラスによって定義された各プロパティに関するプロパティ値を有する。ディレクトリサービスシステムは、スキーマブラウジング部(schema browsing component)、名前解読部(name resolving component)、結合部(binding component)、及び、拡張部(extending component)を含む。スキーマブラウジング部は、各ディレクトリサービスの各オブジェクトクラスにおける各プロパティのプロパティ名及びプロパティタイプを検索することを制御する。ディレクトリサービスシステムのクライアントは、オブジェクトクラスのプロパティ名及びプロパティタイプを検索するために、スキーマブラウジング部を使用する。名前解読部は、オブジェクトの固有識別子をディレクトリサービス内で受信することや、オブジェクトをディレクトリサービス内で見つけ出すことを制御する。結合(binding)部は、ディレクトリサービス内で見つけ出されたオブジェクトを表わすインメモリ(in-memory)オブジェクトと関連づけることを制御する。拡張部は、各ディレクトリサービスのために、新しいオブジェクトクラス及び新しいプロパティを定義することを制御する。ディレクトリサービスシステムのクライアントは、新しいオブジェクトクラス及び新しいプロパティを定義するために拡張部を使用する。
【００１７】
【発明の実施の形態】
本発明は、種々の異なるディレクトリサービスに同じようにアクセスするためのフレームワークを提供する。好ましい実施形態では、OleDs と称されるディレクトリサービスシステムがアーキテクチャを提供し、このアーキテクチャにより、クライアントが、OleDs オブジェクト、属性、及びインターフェースの単一で共通のセットを使用しながら様々なディレクトリサービスのコンテンツにアクセスすることを可能にする。OleDs オブジェクトは、ディレクトリサービスのオブジェクト、及びディレクトリサービスのオブジェクトクラスに対応するインメモリデータ構造(in-memory data structure)である。OleDs オブジェクトがオブジェクトに対応するとき、それはそのオブジェクトのプロパティ値及びメソッドにアクセスするインターフェースを提供する。OleDs オブジェクトがオブジェクトクラスに対応するとき、それはそのオブジェクトクラスの定義にアクセスするインターフェースを提供する。ディレクトリサービスの各プロバイダは、ＡＰＩセットの処理動作をこれらOleDs インターフェースの処置動作にマップするディレクトリサービスに関するインターフェースのインプリメンテーションを提供する。この方法では、OleDs アーキテクチャを使用するために開発されたクライアントが、ディレクトリサービスのＡＰＩセットに相違があるにもかかわらず、これらディレクトリサービスの各々にアクセスすることができる。
【００１８】
OleDs は、「ネームスペース」コンテナ（"namespaces" container）と称される、ルートコンテナオブジェクト内にあるすべてのディレクトリサービスをモデル化する。図３は、ネームスペースコンテナを図示したものである。ネームスペーシズ（namespaces）コンテナ内のオブジェクトは、種々のディレクトリサービスを表わす。OleDs は、ネームスペースコンテナ内に格納されたディレクトリサービスを列挙するためのインターフェースを提供する。格納された各ディレクトリサービスは、OleDs ネームスペースコンテナオブジェクトによって表わされる。クライアントは、ディレクトリサービスの存在に気がつくようなインターフェースを用いることができ、そしてディレクトリサービスのオブジェクトクラスの定義を決定するためにそのスキーマにアクセスすることができる。スキーマはディレクトリサービスのオブジェクトクラスの定義を含む。インターフェースがOleDs によって提供されることを介して、クライアントはコンパイル時で未知であったディレクトリサービスの存在及びコンテンツを実行時に発見することができる。
【００１９】
典型的には、各ディレクトリサービスがそのオブジェクトをネーミングする独自の規定を有するので、OleDs は、様々なディレクトリサービスにある各オブジェクトと競合することなく一意的に識別する統一ネーミング規定（uniform naming convention ）を提供する。固有の識別子は、OleDs パスと称される。OleDs パスは、ディレクトリサービスと、識別されたオブジェクトにアクセスするようにオープンにされる必要があるネスト型の(nested)コンテナオブジェクトのセットとを識別する文字列である。OleDs は以下のようなフォーマットを有する：
@NamespaceIdentifier!<namaspace path to object>
又は
NamespaceIdentifier://<namespace path to object>
「NamespaceIdentifier 」はディレクトリサービスを一意的に識別する。「! 」又は「: 」の後の列は、ディレクトリサービスに依存するフォーマット内にある。即ち、各ディレクトリサービスはその独自フォーマットを定義することができる。
【００２０】
OleDs は、OleDs パス(path)と、OleDs パスが識別するオブジェクトに一致するOleDs オブジェクトとを結びつけるための結合ファンクション(binding function)を提供する。OleDs パスがこの結合ファンクションに渡され、そして結合ファンクションはオブジェクトに対応するOleDs オブジェクトにポインタをリターンする。OleDs オブジェクトと結びつけるために、結合ファンクションは、OleDs パスからのネームスペース識別子を構文解析する。結合ファンクションは、識別されたネームスペースへのアクセスをインプリメントするコード（例えば、ダイナミックリンクライブラリ）を検索するために、このネームスペース識別子を使用する。（OleDs は、OleDs インターフェースのインプリメンテーションの位置を登録するディレクトリサービスプロバイダのためのレジストリを維持する。）
次に、結合ファンクションは検索されたコードを呼び出して、OleDs パスを渡す。呼び出されたコードは、識別されたオブジェクトにアクセスし、且つOleDs インターフェースによって定義された処理動作をインプリメントするために、ディレクトリサービスのＡＰＩセットを使用する。
【００２１】
OleDs は、各ディレクトリサービスのオブジェクトを、OleDs コンテナオブジェクト又はOleDs リーフ(leaf)オブジェクトの何れかとしてモデル化する。ディレクトリサービスのコンテナオブジェクトにアクセスするために、ディレクトリサービスのプロバイダによって提供されたインプリメンテーションを有するOleDs コンテナオブジェクトがインスタンスされる。同様に、ディレクトリサービスのリーフオブジェクトにアクセスするために、ディレクトリサービスのプロバイダによって提供されたインプリメンテーションを有するOleDs リーフオブジェクトがインスタンスされる。各OleDs オブジェクトは、ディレクトリサービスの対応オブジェクトのプロパティにアクセスするためのインターフェースを公開する。各OleDs コンテナオブジェクトはまた、インターフェースを公開し、このインタフェースを介してクライアントが包含されたオブジェクトにアクセスできるようにする。
【００２２】
図４は、ディレクトリサービスにおける、OleDs オブジェクトと、それらの対応オブジェクトとの間の関係を図示したものである。各ディレクトリサービスプロバイダは、OleDs オブジェクトによって公開された各インターフェースのインプリメンテーションを提供する。これらのインプリメンテーションは、プロバイダのＡＰＩセットに関する処理動作をOleDs インターフェースの処理動作にマッピングすることに影響をもたらす。したがって、各クライアントは、OleDs インターフェースのプロバイダ・インプリメンテーションを使用して、複数のディレクトリサービスに同じようにアクセスすることができる。
ディレクトリサービスのオブジェクトにアクセスするクライアントを助けるために、OleDs は、各ディレクトリサービスのスキーマを表わすモデルを定義する。概念的に言えば、各オブジェクトクラスのためのスキーマオブジェクトを含むスキーマコンテナオブジェクトを有するとき、各ディレクトリサービスが閲覧(view)される。スキーマオブジェクトは、オブジェクトクラスのプロパティを定義する。スキーマコンテナは、ネームスペース内にある所定の名前（例えば、「schema」）を指定する。スキーマコンテナにアクセスするため、クライアントはOleDs 結合ファンクションを使用して、スキーマのOleDs パス（例えば、「@WinNTDS!Schema 」）を渡す。OleDs 結合ファンクションは、スキーマコンテナオブジェクトに対応するOleDs コンテナオブジェクトに対して、ポインタをリターンする。クライアントは、格納されたスキーマオブジェクトを列挙するために、OleDs コンテナオブジェクトのインターフェースを使用することができる。この方法では、クライアントは、様々なオブジェクトクラスの定義を実行時に決定することができる。更に、クライアントは、スキーマオブジェクトをスキーマコンテナオブジェクトに加えることによって、追加のオブジェクトクラスを定義することができる。
【００２３】
OleDs は、ディレクトリサービスＡＰＩセットの処理動作を、OleDs インターフェースの処理動作にマッピングするインプリメンテーションを容易にするために、幾つかのオブジェクトクラスを予め定義する。特に、OleDs は、組織的な機関及び国といった、共通のコンテナオブジェクトのためのオブジェクトクラス定義や、ユーザ或いはリソースといった共通のリーフオブジェクトに関するオブジェクトクラス定義を提供する。
OleDs は、デフォルトネームスペース又はディレクトリサービスの概念を定義する。デフォルトネームスペースは、ネームスペースがOleDs パス内に指定されていない場合に、クライアントが使用することを望むネームスペースである。クライアント又はユーザのためのデフォルトネームスペースの識別は、典型的には、レジストリにストアされ、クライアント又はユーザによってインデックス付けされるであろう。
【００２４】
OleDs はまた、クライアントが新たに定義したオブジェクトクラスのオブジェクトを、ディレクトリサービスに加えることを可能にするために、各プロバイダによって実行されるデフォルトOleDs オブジェクトのコンセプトを定義する。典型的には、ディレクトリサービスプロバイダは、ディレクトリサービス内にある各オブジェクトクラスに関するOleDs オブジェクトのインプリメンテーションを提供する。例えば、プロバイダは、コンピュータオブジェクト及び会社オブジェクトのためのオブジェクトクラスに関する異なるインプリメンテーションを提供しうる。各インプリメンテーションは、対応オブジェクトクラスのためにインプリメンテーションのプロパティが定義されていることを知っており、ＡＰＩセットに要求してプロパティの値を検索することができる。しかしながら、クライアントが新しいオブジェクトクラスを実行時に定義するならば、対応のインプリメンテーションはないであろう。その結果、そのディレクトリサービスのために新しいオブジェクトクラスが定義されることを許可する各プロバイダはまた、デフォルトOleDs オブジェクトのインプリメンテーションを提供する。クライアントが、インプリメンテーションをもたないオブジェクトのためにOleDs オブジェクトをインスタンスする要求をするときはいつでも、デフォルトOleDs オブジェクトがインスタンスされる。デフォルトOleDs オブジェクトが対応のオブジェクトクラスの名前を含み、それはオブジェクトクラスの定義をスキーマから検索するのに使用される。この定義を使用することで、デフォルトOleDs オブジェクトは、ディレクトリサービスの対応オブジェクトにアクセスすることができる。
【００２５】
図３Ａは、OleDs の階層構造を図示するブロック図である。階層は、「ネームスペーシズ（Namespaces）」と称されるルート(root)コンテナを含む。ネームスペーシズコンテナは、各ディレクトリサービスのネームスペースを論理的に含む。図３Ｂは、OleDs のアーキテクチャを図示するブロック図である。ディレクトリサービスの各プロバイダは、プロバイダのＡＰＩセットの処理動作をOleDs インターフェースの処理動作にマッピングすることをインプリメントする。各OleDs コンテナオブジェクトは、ディレクトリサービスのコンテナオブジェクトに対応し、そして各OleDs リーフオブジェクトは、ディレクトリサービスのリーフオブジェクトに対応する。
OleDs は、OleDs オブジェクトに対する、クライアントの早期結合(early binding)と遅い結合(late binding)の両方を提供する。早期結合は、クライアントの開発者が各オブジェクトのプロパティ名をコンパイル時に知ることを意味する。したがって、クライアントは、プロパティを「getting 」及び「putting 」するメソッド（例えば、「ｇｅｔ＿Ａｄｄｒｅｓｓ」又は「ｐｕｔ＿Ｎａｍｅ」）を直接使用して、これらのプロパティからそれらの値にアクセスするようにプログラムすることができる。各OleDs オブジェクトは、クライアントが実行時に（即ち、遅い結合）プロパティを結び付けることを可能にする、IDispatch インターフェース（Ole 2.01で定義されている）を公開する。
【００２６】
各OleDs オブジェクトはIOleDsインターフェースを公開する。このIOleDsインターフェースは、ディレクトリサービスにおいて、対応オブジェクトのプロパティにアクセスするメソッドと一緒に、OleDs オブジェクトの様々な属性を定義する。（以下においては、「プロパティ（property）」という用語はディレクトリサービス内のデータを指し、「属性（attribute ）」という用語は、OleDs によって定義された、OleDs オブジェクトに関するデータを指す。）コンテナである各OleDs オブジェクトはまた、IOleDsContainer インターフェースを提供する。IOleDsContainer インターフェースは、コンテナオブジェクトに関係する様々な属性、及び操作されたコンテナオブジェクトのためのメソッドを定義する。更に、各OleDs オブジェクトは、IOleDs<class> 又はIOleDs<class>operations と名づけられたインターフェースを任意に提供することができる。この場合、<class> はディレクトリサービスにおける対応オブジェクトのオブジェクトクラスの名前に相当し、<class>operations はオブジェクトで実行され得るオペレーションに相当する。例えば、ポイントキューオブジェクト(point queue object)が、プリントジョブを休止させ、開始させ、削除するようなオペレーションを有する。以下においては、これらのOleDs インターフェース及び他のOleDs インターフェースの各々は、インターフェースのあるメソッドを一例として実行したときの記述ともに定義される。
【００２７】
図４は、本発明を実施するために構成されたコンピュータシステムのブロック図である。コンピュータシステム400 は、メモリ401 と、中央処理装置402 と、I/O インターフェース403 と、記憶装置404 と、表示装置405 とを含む。OleDs オブジェクトの様々なインプリメンテーションは、ディスク等のコンピュータ読み取り可能メモリにストアされる。これらのインプリメンテーションは実行するためにコンピュータメモリにロードされる。コンピュータメモリはクライアント406,407 を含む。メモリはまた、３つのディレクトリサービスのために、OleDs オブジェクト408,411,414 のインプリメンテーションを含む。OleDs オブジェクトの各インプリメンテーションは、ディレクトリサービス409,412,415 の対応ＡＰＩセットにアクセスする。これらのＡＰＩセットは、基礎をなすディレクトリサービスのために、オブジェクト410,413,416 のプロパティへのアクセスを行う。更に、OleDs 自身は、結合ファンクションのインプリメンテーションと、ネームスペーシズコンテナと、ディレクトリサービスの典型的なオブジェクトに対応する様々なOleDs オブジェクトとを提供する。
【００２８】
OleDsGetObjectファンクション
図５は、OleDs の結合ファンクションであるファンクションOleDsGetObjectのフローチャートである。オブジェクト及びインターフェース識別子へのOleDs パスをファンクションOleDsGetObjectに渡すと、ファンクションOleDsGetObjectはオブジェクトを表わすOleDs オブジェクトのインターフェースにポインタをリターンする。ステップ501 では、このファンクションは、OleDs パスからのネームスペース識別子を構文解析する。このファンクションは、ネームスペース識別子を使用して、識別されたネームスペースのプロバイダが提供する構文解析インターフェースのインプリメンテーションを見つけ出す。ステップ502 では、本ファンクションは、（OLE 2.0.1 で定義された）ファンクションCoGetClassObjectをコールし、識別されたネームスペースのプロバイダがインプリメントしたParseDisplayNameクラスのクラスファクトリオブジェクトへのポインタを検索する。本ファンクションは、識別されたネームスペースのためのParseDisplayNameクラスのクラス識別子を動的に生成する。例えば、構文解析されたネームスペースが「WinNTDS 」ならば、クラス識別子は「CLSID＿PDNWinNTDS」であってよい。クラスファクトリオブジェクトは、ParsedDisplayName クラスのオブジェクトをインスタンスし、これはインスタンスされるべきIParseDisplayName インターフェースを公開する。IParseDisplayName インターフェースは、名前をリターンするメソッドを、OleDs パスによって識別されたオブジェクトに関するOleDs オブジェクトに提供する。ステップ503 では、本ファンクションは、IParseDisplayName インターフェースの識別子を渡すメソッドIClassFactory::CreateInstance を呼び出し、そしてIParseDisplayName インターフェースへのポインタを受信する。メソッドCreateInstanceは、動的に生成されたクラス識別子によって識別されたクラスのインスタンスを作成する。ステップ504 では、本ファンクションは、OleDs パスを渡すメソッドIParseDisplayName::ParseDisplayName を呼び出す。メソッドParseDisplayNameは、OleDs パスによって識別されたオブジェクトに関する名前（IMonikerインターフェース）へのポインタをリターンする。ステップ505 では、本ファンクションは、メソッドIMoniker::BindToObjectを呼び出し、OleDs パスによって識別されたオブジェクトを表わすOleDs オブジェクトへのポインタを検索する。次いで、本ファンクションは、このポインタをOleDs オブジェクトにリターンする。
【００２９】
IOleDsインターフェース
IOleDsインターフェースは、各OleDs オブジェクトに共通な属性及びメソッドを定義する。以下は、その属性及びメソッドの記述を加えたインターフェースの定義である：
Interface IOleDs：IDispatch
｛   HRESULT get Name(string*pName)
HRESULT get Class(string*pClass);
HRESULT get GUID (string*GUID);
HRESULT get OleDsPath(string*pOleDsPath);
HRESULT get Parent (string*pParentContainer);
HRESULT get Schema (string*pSchemaClassObject);
HRESULT Access(IOleDsAccess**ppComponentAccessControl);
HRESULT PropAccess(string PropName, IOleDsAccess**ppComponent
AccessControl);
HRESULT GetInfo(variant vHints);
HRESULT SetInfo(void);
HRESULT Get(string Name,variant*pProp);
HRESULT Put(string Name,variant Prop);
｝
【００３０】
属性
名前          記述                                                      
名前（Name)   コンテナオブジェクト内のこのオブジェクトの相対的な名前
OleDsPath     このオブジェクトのOleDs パス
クラス(Class) このオブジェクトのオブジェクトクラスのネーム
GUID          このオブジェクトクラスのオブジェクトに関する一意的識別子
Parent        このオブジェクトのコンテナオブジェクトのOleDs パス
Schema        このオブジェクトクラスを表わすスキーマオブジェクトのOleDs パス
メソッド
名前          記述                                                      
Access        このオブジェクトのセキュリティパーミッションに一致するOleDs アクセスコントロールオブジェクトの（下で説明される）IOleDsAccessインターフェースを得る。
PropAccess  これのプロパティにアクセスコントロールを表わすOleDs アクセスコントロール従属オブジェクトのIOleDsAccessインターフェースにポインタを戻す。
GetInfo     ディレクトリサービスからこのオブジェクトのプロパティ値を検索し、それらをOleDs オブジェクトにストアする。vHintsパラメータによって、クライアントが、検索されるべきファンクショナルセット又はプロパティを指示することができるので、メソッドはネットワークアクセスを最適化することができる。
SetInfo   このオブジェクトに変化を完遂（コミット）する。プロパティがこのオブジェクトで変化しているならば、メソッドはプロパティ値をOleDs オブジェクトからディレクトリサービスに書込む。
Get       OleDs オブジェクトから名前をつけられたプロパティに関する値を検索する。
Put       OleDs オブジェクトに名前をつけられたプロパティに関する値をセットする。
【００３１】
図６及び図７はIOleDsインターフェースのメソッドのインプリメンテーションを図示する。図６はメソッドIOleDs::GetInfo の流れ図である。このメソッドはオブジェクトに関するプロパティをディレクトリサービスからOleDs オブジェクトにロードする。OleDs はコミットプロセス又はトランザクションプロセスを定義し、オブジェクトのプロパティに対する更新が該コミットプロセス又はトランザクションプロセスによって、（メソッドPut を使用する）OleDs オブジェクトにのみストアされ、クライアントが（メソッドSetInfo を使用して）リクエストしたときにだけディレクトリサービスにストアされる。OleDs オブジェクトが最初に例示されたとき、例えば、ファンクションOleDsGetObjectが呼び出されたとき、例示されたオブジェクトは典型的には、ディレクトリサービスのＡＰＩセットに対するオブジェクトを識別するハンドルを含む。ステップ601 では、メソッドは、ハンドルをオブジェクトと、オブジェクトに関するプロパティ名のリストとにパスさせるファンクションReadObjectを呼び出す。ファンクションReadObjectはディレクトリサービスから名付けられたプロパティに関する値を検索する。
OleDs デフォルトオブジェクトに関するメソッドGetInfo のインプリメンテーションでは、メソッドは、このオブジェクトのオブジェクトクラスに関してスキーマオブジェクトからプロパティ名のリストを検索する。ステップ702 乃至704 では、メソッドループは検索された値をOleDs オブジェクトにストアする。ステップ702 では、メソッドは次の値を選択して、最初から始まる。ステップ703 では、すべての値が既に選択されているならば、次いで、メソッドは戻り、代わりにメソッドはステップ704 に続く。ステップ704 では、メソッドは選択された値をOleDs オブジェクト内にストアし、次の値を選択すべくステップ702 にループする。
【００３２】
図７はメソッドIOleDs::Get の流れ図である。メソッドはプロパティ名をパスし、パスされたプロパティのその値をOleDs オブジェクトから検索し、且つ、戻す。
【００３３】
IOleDsContainer インターフェース
IOleDsContainer インターフェースは、コンテナである各OleDs オブジェクトに共通な属性及びメソッドを定義する。以下は、その属性及びメソッドの記述を加えたインターフェースの定義である。
Interface IOleDsContainer:IDispatch
｛
HRESULT get Count(long*pCount);
HRESULT get NewEnum(IUnknown*ppEnum);
HRESULT get Filter（Variant*pFiler);
HRESULT put Filter（Variant Filter);
HRESULT GetObject(string Class,string RelativeName,IOleDS **
ppNameObject);
HRESULT Create (string Class,string RelativeName,IOleDS**ppNew
Object);
HRESULT Delete (string Class,String RelativeName);
HRESULT CopyHere(string SourceObject,string NewName,IOleDs**
ppNewObject);
HRESULT MoveHere(string SourceObject,string NewName,IOleDs**
ppNewObject);
｝
【００３４】
属性
名前          記述                                                      
Filter        特定の目録に戻されるべきオブジェクトクラスに関するフィルタの配列。フィルタが空ならば、すべてのオブジェクトクラスのすべてのオブジェクトは戻される。各配列エントリは以下のフォーマットを有する。
<FilterEntry>::=<ClassName>
｜<ClassName>.<PropName>
｜<ClassName>.<FuncSetName>
｜<ClassName>.<FuncSetName>.<PropName>
｜<GUID>
｜"Provider Specific String"
Count         フィルタをパスするコンテナ内のOleDs オブジェクトの数
＿NewEnum     収容されたオブジェクトのエニュメレータ
メソッド
名前          記述                                                      
GetObject     オブジェクトのIOleDsインターフェースを、コンテナオブジェクト内のオブジェクトクラス及び相対的な名前によって識別されるこのコンテナオブジェクトに戻す。
Create        このコンテナオブジェクト内に指定されたオブジェクトクラス及び相対的な名前のオブジェクトを作り、ポインタをIOleDsインターフェースに戻す。オブジェクトは、メソッドIOleDs::SetInfo が呼び出されるまでディレクトリサービス内に実際には作られないので、コミットされたプロパティはセットされるべきである。
Delete        このコンテナオブジェクト内のオブジェクトクラスと相対的な名前によって識別されたオブジェクトを削除する。
CopyHere      指定されたオブジェクトと同一である新しいオブジェクトをこのコンテナオブジェクトに作り、IOleDsインターフェースへのポインタを新しいオブジェクトに戻す。NewName は、存在するならば、コンテナオブジェクト内にある新しいオブジェクトの名前を含む選択的なパラメータである。
MoveHere      ソースオブジェクトがコピーの後で削除されることを除いて、メソッドCopyHereと同様である。
【００３５】
図８はメソッドIOleDsContainer::CopyHere のフローチャートである。このメソッドは、このコンテナオブジェクト内にある指定されたソースオブジェクトのコピーを作る。ステップ801 では、本メソッドは、コピーされるべきオブジェクトのオブジェクトクラスを決定する。ステップ802 では、本メソッドは、ファンクションCreateObjectを呼び出すことによって、決定されたオブジェクトのオブジェクトクラスをディレクトリサービス内に作る。ステップ803 では、本メソッドは、オブジェクトクラスのためのスキーマオブジェクトへのOleDs パスを検索する。ステップ804 では、メソッドはOleDs パスをスキーマオブジェクトに渡すファンクションOleDsGetObjectを呼び出し、OleDs スキーマオブジェクトのIOleDsインターフェースへのポインタを検索する。ステップ805 では、本メソッドは、IOleDsClass インターフェースへのポインタを検索するために、OleDs スキーマオブジェクトのメソッドIOleDs::QueryInterfaceを呼び出す。IOleDsClass インターフェースは、このオブジェクトクラスのために定義されたプロパティ名を検索するメソッドを提供する。ステップ806 では、本メソッドは、このスキーマクラスの必須のプロパティリストを検索するために、メソッドIOleDsClass::GetMandatoryProperties を呼び出す。ステップ807 では、本メソッドは、このクラスに関する追加のプロパティを検索するために、メソッドIOleDs::Propertiesを呼び出す。ステップ808〜811 では、本メソッドループ(method loops)は、プロパティの各値を、ソースOleDs オブジェクトから宛先OleDs オブジェクトまでコピーする。ステップ808 では、本メソッドは次のプロパティを選択し、最初から始める。ステップ809 では、全てのプロパティが既に選択されているならば、本メソッドはステップ812 に続き、他の場合は、本メソッドはステップ810 に続く。ステップ810 では、メソッドは、選択されたプロパティに関する値を検索するために、ソースOleDs オブジェクトのメソッドIOleDs::Get を呼び出す。ステップ811 では、本メソッドは宛先IOleDsオブジェクトで検索された値をストアし、次のプロパティを選択するためにステップ808 にループする。ステップ812 では、メソッドはソースOleDs オブジェクトの属性を宛先OleDs オブジェクトにコピーし、リターンする。
図９は、メソッドIOleDs::Createのフローチャートである。ステップ901 では、本メソッドは、オブジェクトクラスを渡すディレクトリサービスのファンクションCreateObjectを呼び出し、そのオブジェクトクラスの新たに作られたオブジェクトへのハンドルを受信する。
【００３６】
IOleDsClass インターフェース
IOleDsClass インターフェースは、オブジェクトクラスの定義へのアクセスを提供するために、OleDs スキーマによって公開される。以下は、その属性とメソッドの記述を加えたインターフェースの定義である。
Interface IOleDsClass:IOleDs
｛
HRESULT get PrimaryInterface(string*GUID);
HRESULT get CLSID(string CLSID);
HRESULT put CLSID(string CLSID);
HRESULT get OID(string*OID);
HRESULT put OID(string OID);
HRESULT get Abstract(boolean*Abstract);
HRESULT put Abstract(boolean Abstract);
HRESULT get MandatoryProperties(Variant*Mandatory);
HRESULT put MandatoryProperties(Variant Mandatory);
HRESULT get DerivedFrom(Variant*pDerivedFrom);
HRESULT put DerivedFrom(Variant DerivedFrom);
HRESULT get Containment(Variant*pContainment);
HRESULT put Containment(Variant Containment);
HRESULT get Container(boolean*pContainer);
HRESULT put Container(boolean Container);
HRESULT get HelpFileName(string*pHelpFile);
HRESULT put HelpFileName(string HelpFile);
HRESULT get HelpFileContext(long*pHelpContext);
HRESULT put HelpFileContext(long HelpContext);
HRESULT Attributes(IOleDsCollection**ppAttributes)
｝
【００３７】
属性
名前                  記述                                              
CLSID                 このオブジェクトクラスに関してOLE DSオブジェクトを実行するコードのCLSID
OID                   このオブジェクトクラスを定義するネームスぺーススペシフィックオブジェクト識別子。これは、オブジェクトクラスのためのネームスペーススペシフィックOIDsを要求するネームスペースにおいて、OLE DSを介してスキーマ拡大を可能にするように提供される。
Abstract              このオブジェクトクラスがアブストラクトであるかどうか指示するブール値
MandatoryProperties   記憶領域に書き込まれるべきオブジェクトクラスに設定されなければならないプロパティのリスト
Primary Interface     このオブジェクトクラスのオブジェクトに関するプライマリインターフェース識別子。これは、IOleDsUserをサポートすることによって定義されるならば、例えば「user」クラスを定義するインターフェースに関するIID である。
DriverdFrom           このオブジェクトクラスが得られる中間スーパークラスを示すOleDs パス列の配列
Container             このオブジェクトクラスがコンテナであるかどうか決定するプロパティ
HelpFileName          このオブジェクトクラスのオブジェクトについて更なる情報を含むヘルプファイルの名前
HelpFileContext       このオブジェクトクラスで特定の情報を見つけることができるHelpFileName内のContext ID
メソッド
名前          記述                                                      
Attributes    このプロパティの追加の属性[delete???] を説明するOleDs オブジェクトの集合をリターンする
IOleDsPropertyインターフェース
OleDs はオブジェクトクラスの各プロパティに対応するOleDs プロパティオブジェクトを定義する。OleDs プロパティオブジェクトはプロパティの定義を検索するインターフェースを公開する。以下は、属性とメソッドの記述を加えたインターフェースの定義である。
Interface IOleDsProperty：IOleDs
｛
HRESULT get OleDsNames(Variant*pOleDsNames);
HRESULT get DsNames(Variant*pDsName);
HRESULT get OID(string OID);
HRESULT put OID(string*OID);
HRESULT get Syntax(string*pSyntax);
HRESULT put Syntax(string Syntax);
HRESULT get MaxRange(long*pMaxRange);
HRESULT put MaxRange(long MaxRange);
HRESULT get MinRange(long*pMinRange);
HRESULT put MinRange(long MinRange);
HRESULT get MultiValued(long*pMultiValued);
HRESULT put MultiValued(long MultiValued);
HRESULT Attributes(IOleDsCollection**ppAttributes)
｝
【００３８】
属性
名前          記述                                                      
OleDsNames    OleDs がこのプロパティにアクセスすることができる名前を含む文字列の配列
DsNames       基礎をなすネームスペースがこのプロパティにアクセスすることができる名前を含むストリングの配列
OID           このプロパティを定義するネームスペーススペシフィックオブジェクト識別子
Syntax        このプロパティの構文を定義するスキーマシンタックスオブジェクトの相対的なパス。現在のスキーマコンテナに関連している。
MaxRange      プロパティに指定した値の上限
MinRange      プロパティに指定した値の下限
Normal        このプロパティが標準的に複製されるべきかどうか決定する値
MultiValued   このプロパティがマルチバリュー（multi-value ）であるかどうか決定する値
メソッド
名前          記述                                                      
Attributes    このプロパティの追加の属性を説明するOLE DSオブジェクトの集合をリターンする
IOleDs<Class> インターフェース
OleDs は、IOleDs<class> と名付けられたインターフェースをサポートすることができる全てのオブジェクトクラスを定義し、ここで<class> はオブジェクトクラスの名前である。このインターフェースはメソッドを有し、オブジェクトクラスによってサポートされた各ファンクション集合は、そのファンクション集合のためのOlDsFunctionalSet オブジェクトに対するポインタをリターンする。
Interface IOleDsUser：IOleDs
｛
HRESULT get BusinessInfo
(IOleDs FS UserBusinessInfo**ppFuncSet);
｝：
【００３９】
OleDs オブジェクトクラス定義
OleDs は、コンテナオブジェクトとリーフオブジェクトの両方のための様々なオブジェクトクラスを定義する。OleDsは、コンテナオブジェクトのために以下のオブジェクトクラス定義する。
ネームスペーシズ（Namespaces）
ネームスペース（Namespace ）
国（Country ）
地域（Locality）
組織（Organization）
ドメイン（Domain）
組織ユニット（Organizational Unit ）
コンピュータ（Computer）
ファイルサービス（File Service）
OleDsは、リーフオブジェクトのために以下のオブジェクトクラス定義する。
ユーザ（User）
グループ（Group ）
エイリアス（Alias ）
サービス（Service ）
ポイントキュー（Point Queue ）
ポイントジョブ（Point Job ）
ポイントデバイスセッション（Point Device Session）
リソース（Resource）
ファイル共有（File Share）
ネームスペーシズオブジェクトは、ネームスペースオブジェクトのコンテナである。ネームスペーシズオブジェクトのインプリメンテーション（実装）は、OleDs の一部である。ネームスペーシズオブジェクトは、IOleDsネームスペーシズインターフェースを公開する。このインターフェースを以下に示す。
Interface IOleDsNamespaces：IOleDs
｛
get DefaultContainer(string *pDefault);
set DefaultContainer(string Default);
｝
ネームスペースオブジェクトは、所定のネームスペースに関する全てのOleDs オブジェクトソースであるコンテナオブジェクトである。国オブジェクトは、国に関するプロパティを有するコンテナオブジェクトである。地域オブジェクトは、地域（例えば、州）に関するプロパティを有するコンテナオブジェクトである。以下は、地域オブジェクトのプロパティを得て設定するインターフェースの定義である。
Interface IOleDsFSLocalityGeneralInfo:IDispatch
｛
HRESULT get Description(string*Description);
HRESULT put Description(string Description);
HRESULT get LocalityName(string LocalityName);
HRESULT put LocalityName(string LocalityName);
HRESULT get PostalAddress(string*pPostalAddress);
HRESULT put PostalAddress(string pPostalAddress);
HRESULT get SeeAlso(VARIANT*pSeeAlso);
HRESULT put SeeAlso(VARIANT Also);
HRESULT Access(IOleDsAccess**ppFuncSetAccessControl);
HRESULT PropAccess(string PropName, IOleDsAccess **ppPropAccess
Control);
｝
メソッド
名前          記述                                                      
Access        アクセスコントロール依存オブジェクトのIOleDsAccessインターフェースにポインタをリターンする。ここで、IOleDsAccessインターフェースは、本インターフェース上でアクセス制御を表わす。
PropAccess    PropNameによって指示されるとき、アクセスコントロール依存オブジェクトのIOleDsAccessインターフェースにポインタをリターンする。ここで、IOleDsAccessインターフェースは、本インターフェース上でアクセス制御を表わす。
【００４０】
属性
名前          記述                                                      
Description   地域を説明するテキスト
LocalityName  地域名。地域名はコンテナが物理的に配置される地図エリアを特定する。
PostalAddress 地域のメイン郵便アドレス
SeeAlso       このオブジェクトに関連し得る他のディレクトリオブジェクト名の配列
OleDs 定義されたオブジェクトクラスの各々は、そのオブジェクトクラスのオブジェクトに関するプロパティを定義する。ドメインオブジェクトは、コンピュータシステムのドメインに対応し、且つそのドメインオブジェクトに関するプロパティ（例えば、パスワード）を備えたファンクション集合を有する。組織ユニットオブジェクトは、会社等のエンティティ(entity)に対応する。コンピュータオブジェクトは、ドメイン(domain)のコンピュータに対応する。ユーザオブジェクトは、ビジネス情報、アカウント制限、アカウント統計、及び、ユーザを記述するための他の情報ファンクショナル集合を有する。ビジネス情報ファンクション集合は、国、部、課、マネージャ、オフィスの場所等のビジネスの説明に関するプロパティを含む。アカウント制限ファンクション集合は、無効にされたアカウント、ユーザがログインすることができる時間数等のユーザのアカウントの一般的な特徴を説明したプロパティを含む。アカウント統計ファンクショナン集合は、パスワードが変更された最後の時間及びユーザがアカウントにログインした最後の時間のようなユーザアカウントの統計を特定したプロパティを有する。他の情報ファンクショナル集合は、電子メールアドレス、ホームディレクトリ等の他のユーザ情報に関するプロパティを含む。
【００４１】
OleDs のクライアントの例
図１０は、全てのネームスペーシズ(namespaces)を表示する手順のフローチャートである。この手順は、OleDs のクライアントが全てのネームスペーシズの名前を検索するやり方を図示している。ステップ1001では、ファンクションCoGetClassObjectを呼び出し、OleDs ネームスペーシズオブジェクトのためのクラス、及びIClassFactory インターフェースに関するインターフェース識別子を渡す。本ファンクションは、OleDs ネームスペーシズのためのクラスファクトリインターフェースにポインタをリターンする。ステップ1002では、メソッドIClassFactory::CreateInstance を呼び出して、IOleDsContainer インターフェースのためのインターフェース識別子を渡す。本メソッドは、OleDs ネームスペーシズオブジェクトのインスタンスを作り、ポインタをIOleDsContainer インターフェースにリターンする。ステップ1003では、メソッドIOleDsContainer::get＿NewEnum を呼び出し、ネームスペーシズオブジェクトのためのエニュメレータ（enumerator）を検索する。ステップ1004〜1008では、各ネームスペースを列挙しながらループし、ネームスペースを表示する。ステップ1004では、メソッドIEnumerator::Next を呼び出し、ネームスペースオブジェクトのためのIUnknownインターフェースに対するポインタを検索する。ステップ1005では、全てのネームスペーシズが既に列挙されてしまっているならば本手順はリターンし、そうでなければステップ1006に続く。ステップ1006では、メソッドIUnknown::QueryInterfaceを呼び出し、ネームスペースオブジェクトのためのIOleDsインターフェースに対するポインタを検索する。ステップ1007では、メソッドIOleDs::get＿Nameを呼び出し、ネームスペースオブジェクトと関係している名前を検索する。ステップ1008では、検索された名前を表示し、次のネームスペースオブジェクトを列挙するためにステップ1004にループする。
【００４２】
以上、好ましい実施形態に関して本発明を説明してきたが、本発明を本実施形態に限定すべきではない。本発明の精神の範囲内での変更は当業者にとって明らかであろう。本発明の範囲は特許請求の範囲によって定義される。
【図面の簡単な説明】
【図１】  ディレクトリサービスのサンプル階層構造を図示する。
【図２】  オブジェクトを表わすのに使用される典型的なデータ構造を図示する。
【図３Ａ】  OleDs の階層構造を図示する。
【図３Ｂ】  ディレクトリサービスにおけるOleDs オブジェクトとそれらに対応するオブジェクトとの間の関係を図示する。
【図４】  本発明を実施するために構成されたコンピュータシステムのブロック図である。
【図５】  OleDs の割り当てファンクションである、ファンクションOleDsGetObjectのフローチャートである。
【図６】  メソッドIOleDs::GetInfo のフローチャートである。
【図７】  メソッドIOleDs::Get のフローチャートである。
【図８】  メソッドIOleDsContainer::CopyHere のフローチャートである。
【図９】  メソッドIOleDs::Createのフローチャートである。
【図１０】  全てのネームスペースを表示するためのプロシージャのフローチャートである。
【符号の説明】
400   コンピュータシステム
401   メモリ
402   中央処理装置
403   I/O インターフェース
404   記憶装置
405   表示装置
406,407   クライアント
408,411,414 OleDs オブジェクト
409,412,415   ディレクトリサービス
410,413,416   オブジェクト
【図１】
0004197753.tif 000002
【図２】
0004197753.tif 000003
【図３Ａ】
0004197753.tif 000004
【図３Ｂ】
0004197753.tif 000005
【図４】
0004197753.tif 000006
【図５】
0004197753.tif 000007
【図６】
0004197753.tif 000008
【図７】
0004197753.tif 000009
【図８】
0004197753.tif 000010
【図９】
0004197753.tif 000011
【図１０】
0004197753.tif 000012