共用方式為


Active Directory 使用者和電腦 屬性表

Active Directory 使用者和電腦 MMC 嵌入式管理單元的設計目的是要針對 Active Directory 伺服器中的各種物件顯示屬性表。 屬性表包含一或多個頁面,可用來檢視和修改對象數據。 不同的物件類型會針對它們顯示不同的頁面集。 Active Directory 使用者和電腦 MMC 嵌入式管理單元也可讓第三方廠商針對特定類型的物件,將自定義頁面新增至屬性表。 如需詳細資訊,請參閱 屬性頁以搭配顯示規範使用。

除了 Active Directory 使用者和電腦 MMC 嵌入式管理單元之外,某些應用程式必須為使用者提供 Active Directory 伺服器中物件的檢視和編輯屬性的能力。 應用程式可以實作自己的屬性表,但最好提供一致的使用者介面,以減少混淆和學習時間。 幸運的是,Active Directory 使用者和電腦 MMC 嵌入式管理單元可讓任何 OLE COM 應用程式顯示物件的屬性表,該屬性表與相同物件 Active Directory 使用者和電腦 MMC 嵌入式管理單元所顯示的屬性表相同。

如需裝載 Active Directory 使用者和電腦 屬性表的詳細資訊和程式代碼範例,請參閱 Platform Software Development Kit (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 結構都代表單一目錄物件。 cItems 成員包含陣列中的元素數目。 只會使用此陣列中的第一個物件。 會忽略其他物件。

    • CFSTR_DSDISPLAYSPECOPTIONS此數據格式包含 DSDISPLAYSPECOPTIONS 結構,其中包含屬性頁將使用的數據,例如要從何處載入屬性頁、伺服器和要使用的認證等等。 DSDISPLAYSPECOPTIONS 的較重要成員會顯示在下列清單中。

      offsetAttribPrefix 屬性前置詞字串會決定取得屬性頁清單的位置。 這必須包含下列其中一個字串。

      屬性前置詞字串 描述
      “admin”
      屬性頁會從 adminPropertyPages 屬性載入。
      “shell”
      屬性頁會從 shellPropertyPages 屬性載入。
    • CFSTR_DS_PROPSHEETCONFIG此數據格式包含包含屬性表主數據的 PROPSHEETCFG 結構。 裝載屬性表時,PROPSHEETCFG 結構中更重要的成員會包含下列清單中顯示的數據。

      lNotifyHandle 必須是零。 hwndParentSheet 包含視窗的句柄,可在其中一個頁面中的項目變更並套用時接收 WM_ADSPROP_NOTIFY_CHANGE 訊息。 如果不需要此訊息,可以為 NULL

      hwndHidden 包含要接收WM_DSA_SHEET_CREATE_NOTIFYWM_DSA_SHEET_CLOSE_NOTIFY訊息之視窗的句柄。 將此設定為隱藏視窗的句柄。

      wParamSheetClose 包含WM_DSA_SHEET_CLOSE_NOTIFY訊息中 wParam回的應用程式定義標識符。 如果這個成員為零, 則不會將WM_DSA_SHEET_CLOSE_NOTIFY 訊息張貼到隱藏視窗。

  3. 建立 CLSID_DsPropertyPages 對象的實例,並取得 物件的 IShellExtInit 介面。 您也可以複製CLSID_DsPropertyPages對象的行為。 如需詳細資訊,請參閱複製CLSID_DsPropertyPages對象的行為。

  4. 呼叫 IShellExtInit::Initialize 方法,初始化CLSID_DsPropertyPages物件。 這個方法不會使用 pidlFolderhkeyProgID 參數。 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 函式來顯示屬性表。

如果任何頁面中的數據已變更,而且按兩下 [確定] 或 [套用] 按鈕,則 PROPSHEETCFG 結構之 hwndParentSheet 成員所識別視窗會收到WM_ADSPROP_NOTIFY_CHANGE訊息。 此訊息絕對是通知,不需要任何特定動作。

關閉頁面時,PROPSHEETCFG 結構的 hwndHidden 成員所識別的視窗會收到WM_DSA_SHEET_CLOSE_NOTIFY訊息。 此訊息絕對是通知,不需要執行任何特定動作。

在某些情況下,現有的屬性表必須顯示次要屬性表。 例如,如果您顯示使用者物件的屬性表並選取 [成員] 頁面,則會顯示使用者所屬的群組清單。 如果您按兩下清單中的其中一個群組,則會顯示該群組的屬性表。 主要屬性表本身不會顯示次要工作表。 它會要求主機將WM_DSA_SHEET_CREATE_NOTIFY訊息傳送至 PROPSHEETCFG 結構的 hwndHidden 成員所識別的視窗,以顯示次要工作表。 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. 列舉對象類別之顯示規範的 adminPropertyPagesshellPropertyPages 屬性中的值。 每個值都是包含數位的字串,後面接著逗號,後面接著屬性頁延伸模組類別標識符的字串表示。 如需屬性頁顯示規範值格式的詳細資訊,請參閱 在顯示規範中註冊屬性頁 COM 物件。
  2. 使用 CLSIDFromString 函式,將每個類別識別符字串轉換成 CLSID
  3. 依屬性值中每個類別識別符字串前面的數位排序擴充類別標識碼。 如果兩個數位相同,請依照從 Active Directory 伺服器取得屬性值的順序排序類別標識碼。
  4. 列舉擴充類別標識碼,建立每個延伸模組的實例。
  5. 針對每個延伸模組,依照上面排序的順序,使用裝載 Active Directory 使用者和電腦 屬性表程式步驟 4 中所述的相同資訊,呼叫延伸模組的 IShellExtInit::Initialize
  6. 針對每個延伸模組,依照上面排序的順序,呼叫延伸模組的 IShellPropSheetExt::AddPages,其中包含裝載 Active Directory 使用者和電腦 屬性表程式的步驟 5 中所述的資訊。

可能的話,請使用 CLSID_DsPropertyPages 物件來建立頁面,而不是手動執行此動作。 CLSID_DsPropertyPages已經過優化,且會正確處理失敗案例,例如當目前地區設定沒有顯示規範時。 此外,CLSID_DsPropertyPages對象未來可能會變更,這表示您的屬性表可能無法完全符合 #D4001728E41FD435CA5E2890A80081986 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