次の方法で共有


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 サーバー内のオブジェクトのプロパティ シートを表示するには

  1. メッセージの処理に使用できるウィンドウを作成します。 これは、既存のウィンドウまたは特別な目的のウィンドウにすることができます。 これは 隠しウィンドウと呼ばれます。

  2. IDataObject から派生した OLE COM オブジェクトを作成します。 このデータオブジェクトは、次のデータ形式をサポートする必要があります:

  3. CLSID_DsPropertyPages オブジェクトのインスタンスを作成し、オブジェクトの IShellExtInit インターフェイスを取得します。 また、CLSID_DsPropertyPagesオブジェクトの振る舞いを複製することも可能です。 詳細については、「CLSID_DsPropertyPages オブジェクトの動作の複製」を参照してください。

  4. IShellExtInit::Initialize メソッドを呼び出して、CLSID_DsPropertyPagesオブジェクトを初期化します。 pidlFolder パラメーターと hkeyProgID パラメーターは、このメソッドでは使用されません。 pdtobj パラメーターは、ステップ 2 で作成したデータ・オブジェクトを指すポインターです。 IShellExtInit::Initializeメソッドが呼び出されると、CLSID_DsPropertyPages オブジェクトはデータ オブジェクトへの参照を保存します。

  5. CLSID_DsPropertyPagesオブジェクトの IShellPropSheetExt インターフェイスを取得し、 IShellPropSheetExt::AddPages メソッドを呼び出します。 lpfnAddPage パラメーターは、実装する必要があるコールバック関数のアドレスです。 この関数の形式を以下に示します。 コールバック関数が C++ クラスのメンバーとして宣言されている場合、コールバック関数は static として宣言する必要があります。 lParam パラメーターは、コールバック関数を実装するオブジェクトを識別するために使用できるアプリケーション定義の値です。 IShellPropSheetExt::AddPages メソッドが呼び出されると、CLSID_DsPropertyPages オブジェクトはデータ オブジェクトからデータを取得し、オブジェクト表示指定子に登録されているプロパティ ページを列挙します。 CLSID_DsPropertyPages オブジェクトは、プロパティ ページ オブジェクトを列挙し、各オブジェクトの IShellPropSheetExt::AddPages メソッドを呼び出します。

    BOOL CALLBACK AddPagesCallback(HPROPSHEETPAGE, LPARAM)
    
  6. プロパティ ページ オブジェクトによって追加された各ページでは、プロパティ ページへのハンドルとアプリケーション定義の値を使用してコールバック関数が呼び出されます。 コールバック関数には、渡される各プロパティ ページ ハンドルを格納する必要があります。 CLSID_DsPropertyPages オブジェクトの IShellPropSheetExt::AddPages メソッドが戻ると、コールバック関数を介してすべてのページが追加されます。

  7. プロパティ シートを表示するには、 PROPSHEETHEADER構造体を入力します。 phpage メンバーは、コールバック関数によって収集されたページ ハンドルの配列へのポインターを受け取ります。 nPages メンバーは、ページ ハンドル配列内のページ数を受け取ります。

  8. 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 オブジェクトの動作を複製するには

  1. オブジェクトクラスの表示指定子のadminPropertyPages属性またはshellPropertyPages属性の値を列挙します。 各値は、数値、コンマ、プロパティ ページ拡張機能のクラス識別子の文字列表現を含む文字列です。 プロパティ ページの表示指定子の値の形式の詳細については、表示指定子でのプロパティ ページ COM オブジェクトの登録を参照してください。
  2. CLSID CLSIDFromString 関数を使用して 、各クラス識別子 文字列を CLSID に変換します。
  3. 拡張クラス識別子は、属性値の各クラス識別子文字列の前にある番号で並べ替えます。 2 つの数値が同じ場合は、Active Directory サーバーから属性値を取得した順序でクラス識別子を並べ替えます。
  4. 拡張クラス識別子を列挙し、各拡張のインスタンスを作成します。
  5. 拡張機能ごとに、上記で並べ替えた順序で、「Active Directory ユーザーとコンピューターのプロパティ シートのホスト」の手順 4 で説明したのと同じ情報を使用して、拡張機能の IShellExtInit::Initialize を呼び出します。
  6. 拡張機能ごとに、上記で並べ替えた順序で、「Active Directory ユーザーとコンピューターのホスト」プロパティ シートの手順 5 で説明したのと同じ情報を使用して、拡張機能の IShellPropSheetExt::AddPages を呼び出します。

可能であれば、手動で行うのではなく、CLSID_DsPropertyPages オブジェクトを使用してページを作成します。 CLSID_DsPropertyPages は最適化されており、現在のロケールで表示指定子を使用できない場合など、エラーケースを正しく処理します。 また、CLSID_DsPropertyPages オブジェクトは将来変更される可能性があるため、プロパティ シートは Active Directory ユーザーとコンピュータ MMC スナップインで表示されるものと完全に一致しない可能性があります。

特殊なプログラミング要素

現在、次のプログラミング要素は、発行されたヘッダー ファイルでは定義されていません。 これらの要素を使用するには、特定のリファレンス ページに示されている正確な形式で自分で定義する必要があります。

コード例

次の 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