次の方法で共有


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 サンプルを参照してください。

開発者対象ユーザー

このドキュメントでは、C++ を使用した COM 操作とコンポーネント開発について読者が理解していることを前提としています。 現時点では、Visual Basic を使用して Active Directory プロパティ シート拡張機能を作成することはできません。

Active Directory ユーザーとコンピューターのプロパティ シートのホスト

Active Directory サーバー 内のオブジェクトのプロパティ シートを表示するには

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

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

    • CFSTR_DSOBJECTNAMES このデータ形式には、プロパティ シートが適用されるオブジェクトを識別する DSOBJECTNAMES が含まれています。 プロパティ シートをホストする場合、DSOBJECTNAMES 構造体のより重要なメンバーを次の一覧に示します。

      clsidNamespace 予約済み。 将来使用される場合は、ここでアプリケーションの GUID に設定します。

      aObjects DSBOJECT構造体の配列含まれています。 DSBOJECT 構造体 は、1 つのディレクトリ オブジェクトを表します。 cItems メンバーには、配列内の要素の数が含まれています。 この配列の最初のオブジェクトのみが使用されます。 その他のオブジェクトは無視されます。

    • CFSTR_DSDISPLAYSPECOPTIONS このデータ形式には、プロパティ ページの読み込み先、使用するサーバーと資格情報など、プロパティ ページで使用されるデータを含む DSDISPLAYSPECOPTIONS 構造体が含まれています。 DSDISPLAYSPECOPTIONS のより重要なメンバーを次の一覧に示します。

      offsetAttribPrefix 属性プレフィックス文字列によって、プロパティ ページのリストが取得される場所が決まります。 これには、次のいずれかの文字列が含まれている必要があります。

      属性プレフィックス文字列 形容
      "admin"
      プロパティ ページは、adminPropertyPages 属性から読み込まれます。
      "shell"
      プロパティ ページは、shellPropertyPages 属性から読み込まれます。
    • CFSTR_DS_PROPSHEETCONFIG このデータ形式には、プロパティ シートのホスト データを含む PROPSHEETCFG 構造体が含まれています。 プロパティ シートをホストする場合、PROPSHEETCFG 構造体のより重要なメンバーには、次の一覧に示すデータが含まれます。

      lNotifyHandle 0 にする必要があります。 hwndParentSheet ページ内の何かが変更され、適用されたときに WM_ADSPROP_NOTIFY_CHANGE メッセージを受信するウィンドウのハンドルが含まれます。 このメッセージが望ましくない場合は、NULL できます。

      hwndHiddenWM_DSA_SHEET_CREATE_NOTIFY および WM_DSA_SHEET_CLOSE_NOTIFY メッセージを受信するウィンドウのハンドルが含まれます。 これを非表示ウィンドウのハンドルに設定します。

      wParamSheetCloseWM_DSA_SHEET_CLOSE_NOTIFY メッセージの wParam で返されるアプリケーション定義識別子が含まれています。 このメンバーが 0 の場合、WM_DSA_SHEET_CLOSE_NOTIFY メッセージは非表示ウィンドウに投稿されません。

  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++ クラスのメンバーとして宣言されている場合、コールバック関数は静的 として宣言必要があります。 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 メッセージを受信します。 このメッセージは厳密に通知であり、特定のアクションを実行する必要はありません。

場合によっては、既存のプロパティ シートにセカンダリ プロパティ シートを表示する必要があります。 たとえば、ユーザー オブジェクトのプロパティ シートを表示し、[メンバーの] ページを選択すると、ユーザーがメンバーになっているグループの一覧が表示されます。 一覧でこれらのグループのいずれかをダブルクリックすると、そのグループのプロパティ シートが表示されます。 プライマリ プロパティ シートには、セカンダリ シート自体は表示されません。 ホストは、PROPSHEETCFG 構造体の hwndHidden メンバーによって識別されるウィンドウに WM_DSA_SHEET_CREATE_NOTIFY メッセージを送信して、セカンダリ シートを表示するように要求します。 WM_DSA_SHEET_CREATE_NOTIFY メッセージの wParam は、セカンダリ プロパティ シートとそれが表すオブジェクトに関する情報を含む DSA_SEC_PAGE_INFO 構造体へのポインターです。 このメッセージに応答して、プロパティ シート ホストは、上記と同じ方法でセカンダリ プロパティ シートを表示する必要があります。 WM_DSA_SHEET_CREATE_NOTIFY メッセージを処理した後、LocalFree 関数に wParam 値を渡すことによって、メッセージ受信者は DSA_SEC_PAGE_INFO 構造体を解放する必要があります。

CLSID_DsPropertyPages オブジェクトの動作の複製

CLSID_DsPropertyPages オブジェクトの動作を複製するには

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

可能であれば、手動で行うのではなく、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