Active Directory ユーザーとコンピュータプロパティ シート
Active Directory ユーザーとコンピュータ MMC スナップインは、Active Directory サーバー内のさまざまなオブジェクトのプロパティ シートを表示するように設計されています。 プロパティ シートには、オブジェクト データの表示と変更に使用される 1 つ以上のページが含まれています。 オブジェクトの種類が異なれば、表示されるページのセットも異なります。 また、Active Directory ユーザーとコンピュータ MMC スナップインを使用すると、サード パーティ ベンダは、特定の種類のオブジェクトのプロパティ シートにカスタム ページを追加することもできます。 詳細については 表示指定子で使用するプロパティ ページを参照してください
Active Directory ユーザーとコンピュータ MMC スナップイン以外の一部のアプリケーションでは、Active Directory サーバー内のオブジェクトの属性を表示および編集する機能をユーザーに提供する必要があります。 アプリケーションは独自のプロパティ シートを実装できますが、混乱と学習時間を減らすために、一貫性のあるユーザー インターフェイスを提供することをお勧めします。 さいわい、Active Directory ユーザーとコンピュータ MMC スナップインを使用すると、任意の OLE COM アプリケーションで、Active Directory ユーザーとコンピュータ MMC スナップインで同じオブジェクトに対して表示されるプロパティ シートと同じオブジェクトのプロパティ シートを表示できます。
詳細と、Active Directory ユーザーとコンピューターのプロパティ シートをホストするコード例については、プラットフォーム ソフトウェア開発キット (SDK) の PropSheetHost サンプルを参照してください。
対象となる開発者
このドキュメントは、読者が COM の操作や C++ を使用したコンポーネント開発に精通していることを前提としています。 現在、Visual Basic を使用して Active Directory プロパティ シート拡張機能を作成することはできません。
Active Directory ユーザーとコンピュータプロパティ シートのホスティング
Active Directory サーバー内のオブジェクトのプロパティ シートを表示するには
メッセージの処理に使用できるウィンドウを作成します。 これは、既存のウィンドウまたは特別な目的のウィンドウにすることができます。 これは 隠しウィンドウと呼ばれます。
IDataObject から派生した OLE COM オブジェクトを作成します。 このデータオブジェクトは、次のデータ形式をサポートする必要があります:
CFSTR_DSOBJECTNAMES このデータ形式には、プロパティ シートが適用されるオブジェクトを識別する DSOBJECTNAMES が含まれています。 プロパティ シートをホストする場合、DSOBJECTNAMES 構造体のより重要なメンバーを次の一覧に示します。
clsidNamespace 予約済み。 将来使用する場合に備えて、ここでアプリケーションの GUID を設定します。
aObjects DSBOJECT 構造体の配列を格納します。 各 DSBOJECT 構造体は、1 つのディレクトリーオブジェクトを表します。 cItems メンバーには、配列内の要素の数が含まれています。 この配列の最初のオブジェクトのみが使用されます。 他のオブジェクトは無視されます。
CFSTR_DSDISPLAYSPECOPTIONS このデータ形式には、プロパティ ページを読み込む場所、使用するサーバーと資格情報など、プロパティ ページで使用されるデータを含む DSDISPLAYSPECOPTIONS 構造体が含まれています。 DSDISPLAYSPECCOPTIONSのより重要なメンバーを次の一覧に示します。
offsetAttribPrefix 属性接頭辞文字列は、プロパティ ページの一覧を取得する場所を決定します。 これには、次のいずれかの文字列が含まれている必要があります。
属性接頭辞文字列 説明 "admin" プロパティ ページは、adminPropertyPages 属性から読み込まれます。 "シェル" プロパティ ページは、shellPropertyPages 属性から読み込まれます。 CFSTR_DS_PROPSHEETCONFIG このデータ形式には、プロパティ シート ホスト データを含む PROPSHEETCFG 構造体が含まれています。 プロパティ シートをホストする場合、 PROPSHEETCFG 構造体のより重要なメンバーには、次の一覧に示すデータが含まれます。
lNotifyHandle 0 である必要があります。 hwndParentSheet ページの 1 つで何かが変更され、適用されたときにWM_ADSPROP_NOTIFY_CHANGE メッセージを受信するウィンドウのハンドルが含まれます。 このメッセージが望ましくない場合は、NULL にすることができます。
hwndHidden WM_DSA_SHEET_CREATE_NOTIFY メッセージとWM_DSA_SHEET_CLOSE_NOTIFY メッセージを受信するウィンドウのハンドルを格納します。 これを非表示のウィンドウのハンドルに設定します。
WM_DSA_SHEET_CLOSE_NOTIFY メッセージの wParamSheetClose で返されるアプリケーション定義の識別子を格納します。 このメンバーが 0 の場合、WM_DSA_SHEET_CLOSE_NOTIFYメッセージは非表示のウィンドウにポストされません。
CLSID_DsPropertyPages オブジェクトのインスタンスを作成し、オブジェクトの IShellExtInit インターフェイスを取得します。 また、CLSID_DsPropertyPagesオブジェクトの振る舞いを複製することも可能です。 詳細については、「CLSID_DsPropertyPages オブジェクトの動作の複製」を参照してください。
IShellExtInit::Initialize メソッドを呼び出して、CLSID_DsPropertyPages オブジェクトを初期化します。 pidlFolder パラメーターと hkeyProgID パラメーターは、このメソッドでは使用されません。 pdtobj パラメーターは、ステップ 2 で作成したデータ・オブジェクトを指すポインターです。 IShellExtInit::Initialize メソッドが呼び出されると、CLSID_DsPropertyPages オブジェクトはデータ オブジェクトへの参照を保存します。
CLSID_DsPropertyPages オブジェクトの IShellPropSheetExt インターフェイスを取得し、 IShellPropSheetExt::AddPages メソッドを呼び出します。 lpfnAddPage パラメーターは、実装する必要があるコールバック関数のアドレスです。 この関数の形式を以下に示します。 コールバック関数が C++ クラスのメンバーとして宣言されている場合、コールバック関数は static として宣言する必要があります。 lParam パラメーターは、コールバック関数を実装するオブジェクトを識別するために使用できるアプリケーション定義の値です。 IShellPropSheetExt::AddPages メソッドが呼び出されると、CLSID_DsPropertyPages オブジェクトはデータ オブジェクトからデータを取得し、オブジェクト表示指定子に登録されているプロパティ ページを列挙します。 CLSID_DsPropertyPages オブジェクトは、プロパティ ページ オブジェクトを列挙し、各オブジェクトの IShellPropSheetExt::AddPages メソッドを呼び出します。
BOOL CALLBACK AddPagesCallback(HPROPSHEETPAGE, LPARAM)
プロパティ ページ オブジェクトによって追加された各ページでは、プロパティ ページへのハンドルとアプリケーション定義の値を使用してコールバック関数が呼び出されます。 コールバック関数には、渡される各プロパティ ページ ハンドルを格納する必要があります。 CLSID_DsPropertyPages オブジェクトの IShellPropSheetExt::AddPages メソッドが戻ると、コールバック関数を介してすべてのページが追加されます。
プロパティ シートを表示するには、 PROPSHEETHEADER 構造体を入力します。 phpage メンバーは、コールバック関数によって収集されたページ ハンドルの配列へのポインターを受け取ります。 nPages メンバーは、ページ ハンドル配列内のページ数を受け取ります。
PropertySheet 関数を呼び出して、プロパティ シートを表示します。
いずれかのページ内のデータが変更され、[OK] または [適用] ボタンがクリックされた場合、PROPSHEETCFG 構造体の hwndParentSheet メンバーによって識別されるウィンドウはWM_ADSPROP_NOTIFY_CHANGEメッセージを受け取ります。 このメッセージは厳密には通知であり、特定のアクションは必要ありません。
ページが閉じられると、 PROPSHEETCFG 構造体の hwndHidden メンバーによって識別されるウィンドウは、WM_DSA_SHEET_CLOSE_NOTIFYメッセージを受け取ります。 このメッセージは厳密には通知であり、特定のアクションを実行する必要はありません。
場合によっては、既存のプロパティ シートにセカンダリ プロパティ シートを表示する必要があります。 たとえば、ユーザー オブジェクトのプロパティ シートを表示し、[所属するグループ] ページを選択 すると、ユーザーがメンバーであるグループの一覧が表示されます。 一覧でこれらのグループの 1 つをダブルクリックすると、そのグループのプロパティ シートが表示されます。 プライマリ プロパティ シートは、セカンダリ シートを単独では表示しません。 これは、PROPSHEETCFG 構造体の hwndHidden メンバーによって識別されるウィンドウにWM_DSA_SHEET_CREATE_NOTIFY メッセージを送信するこ とによって、ホストがセカンダリ シートを表示することを要求します。 WM_DSA_SHEET_CREATE_NOTIFY メッセージの wParam は、セカンダリ プロパティ シートとそれが表すオブジェクトに関する情報を含むDSA_SEC_PAGE_INFO構造体へのポインターです。 このメッセージに応答して、プロパティ シート ホストは、上記と同じ方法でセカンダリ プロパティ シートを表示する必要があります。 WM_DSA_SHEET_CREATE_NOTIFY メッセージを処理した後、メッセージ受信者は wParam 値を LocalFree 関数に渡して、DSA_SEC_PAGE_INFO構造体を解放する必要があります。
CLSID_DsPropertyPagesオブジェクトの動作を複製する
CLSID_DsPropertyPages オブジェクトの動作を複製するには
- オブジェクトクラスの表示指定子のadminPropertyPages属性またはshellPropertyPages属性の値を列挙します。 各値は、数値、コンマ、プロパティ ページ拡張機能のクラス識別子の文字列表現を含む文字列です。 プロパティ ページの表示指定子の値の形式の詳細については、表示指定子でのプロパティ ページ COM オブジェクトの登録を参照してください。
- CLSID CLSIDFromString 関数を使用して 、各クラス識別子 文字列を CLSID に変換します。
- 拡張クラス識別子は、属性値の各クラス識別子文字列の前にある番号で並べ替えます。 2 つの数値が同じ場合は、Active Directory サーバーから属性値を取得した順序でクラス識別子を並べ替えます。
- 拡張クラス識別子を列挙し、各拡張のインスタンスを作成します。
- 拡張機能ごとに、上記で並べ替えた順序で、「Active Directory ユーザーとコンピューターのプロパティ シートのホスト」の手順 4 で説明したのと同じ情報を使用して、拡張機能の IShellExtInit::Initialize を呼び出します。
- 拡張機能ごとに、上記で並べ替えた順序で、「Active Directory ユーザーとコンピューターのホスト」プロパティ シートの手順 5 で説明したのと同じ情報を使用して、拡張機能の IShellPropSheetExt::AddPages を呼び出します。
可能であれば、手動で行うのではなく、CLSID_DsPropertyPages オブジェクトを使用してページを作成します。 CLSID_DsPropertyPages は最適化されており、現在のロケールで表示指定子を使用できない場合など、エラーケースを正しく処理します。 また、CLSID_DsPropertyPages オブジェクトは将来変更される可能性があるため、プロパティ シートは Active Directory ユーザーとコンピュータ MMC スナップインで表示されるものと完全に一致しない可能性があります。
特殊なプログラミング要素
現在、次のプログラミング要素は、発行されたヘッダー ファイルでは定義されていません。 これらの要素を使用するには、特定のリファレンス ページに示されている正確な形式で自分で定義する必要があります。
- CFSTR_DS_PROPSHEETCONFIG
- PROPSHEETCFG
- WM_DSA_SHEET_CLOSE_NOTIFY
- WM_DSA_SHEET_CREATE_NOTIFY
- DSA_SEC_PAGE_INFO
コード例
次の C++ コード例は、これらの要素が将来発行されたヘッダー ファイルで定義されている場合でも引き続き機能するこれらの要素を定義する安全な方法を示しています。
#ifndef CFSTR_DS_PROPSHEETCONFIG
#define CFSTR_DS_PROPSHEETCONFIG_W L"DsPropSheetCfgClipFormat"
#define CFSTR_DS_PROPSHEETCONFIG_A "DsPropSheetCfgClipFormat"
#ifdef UNICODE
#define CFSTR_DS_PROPSHEETCONFIG CFSTR_DS_PROPSHEETCONFIG_W
#else
#define CFSTR_DS_PROPSHEETCONFIG CFSTR_DS_PROPSHEETCONFIG_A
#endif //UNICODE
#endif //CFSTR_DS_PROPSHEETCONFIG
#ifndef WM_ADSPROP_SHEET_CREATE
#define WM_ADSPROP_SHEET_CREATE (WM_USER + 1108)
#endif
#ifndef WM_DSA_SHEET_CREATE_NOTIFY
#define WM_DSA_SHEET_CREATE_NOTIFY (WM_USER + 6)
#endif
#ifndef WM_DSA_SHEET_CLOSE_NOTIFY
#define WM_DSA_SHEET_CLOSE_NOTIFY (WM_USER + 5)
#endif
#ifndef DSA_SEC_PAGE_INFO
typedef struct _DSA_SEC_PAGE_INFO
{
HWND hwndParentSheet;
DWORD offsetTitle;
DSOBJECTNAMES dsObjectNames;
} DSA_SEC_PAGE_INFO, *PDSA_SEC_PAGE_INFO;
#endif //DSA_SEC_PAGE_INFO
#ifndef PROPSHEETCFG
typedef struct _PROPSHEETCFG
{
LONG_PTR lNotifyHandle;
HWND hwndParentSheet;
HWND hwndHidden;
WPARAM wParamSheetClose;
} PROPSHEETCFG, *PPROPSHEETCFG;
#endif //PROPSHEETCFG