Поделиться через


таблицы свойств Пользователи и компьютеры Active Directory

Оснастка MMC Пользователи и компьютеры Active Directory предназначена для отображения листа свойств для различных объектов на сервере Active Directory. Лист свойств содержит одну или несколько страниц, которые используются для просмотра и изменения данных объекта. Для разных типов объектов имеются разные наборы страниц, отображаемых для них. Оснастка MMC Пользователи и компьютеры Active Directory также позволяет сторонним поставщикам добавлять пользовательские страницы в лист свойств для определенного типа объекта. Дополнительные сведения см. в разделе "Страницы свойств" для использования с описателями отображения.

Некоторые приложения, отличные от оснастки MMC Пользователи и компьютеры Active Directory, должны предоставить пользователю возможность просмотра и редактирования атрибутов для объекта на сервере Active Directory. Приложение может реализовать собственные листы свойств, но лучше предложить согласованный пользовательский интерфейс, чтобы уменьшить путаницу и время обучения. К счастью, оснастка MMC Пользователи и компьютеры Active Directory позволяет любому приложению OLE COM отображать лист свойств для объекта, идентичного листу свойств, который будет отображаться оснасткой MMC Пользователи и компьютеры Active Directory для того же объекта.

Дополнительные сведения и пример кода, на котором размещен лист свойств Пользователи и компьютеры Active Directory, см. в примере PropSheetHost в пакете средств разработки программного обеспечения платформы (SDK).

Аудитория разработчика

В этой документации предполагается, что читатель знаком с com-операцией и разработкой компонентов с помощью C++. В настоящее время невозможно создать расширение листа свойств Active Directory с помощью Visual Basic.

Размещение листа свойств Пользователи и компьютеры Active Directory

Отображение листа свойств для объекта на сервере Active Directory

  1. Создайте окно, которое можно использовать для обработки сообщений. Это может быть существующее окно или специальное окно назначения. Это называется скрытым окном.

  2. Создайте объект OLE COM, производный от IDataObject. Этот объект данных должен поддерживать следующие форматы данных:

    • CFSTR_DSOBJECTNAMES этот формат данных содержит dsOBJECTNAMES, определяющий объект, к которому применяется лист свойств. При размещении листа свойств более значительные члены структуры DSOBJECTNAMES отображаются в следующем списке.

      clsidNamespace Зарезервировано. Присвойте этому идентификатору GUID для приложения, если оно будет использоваться в будущем.

      aObjects Содержит массив структур DSBOJECT . Каждая структура DSBOJECT представляет один объект каталога. Элемент cItems содержит количество элементов в массиве. Используется только первый объект в этом массиве. Другие объекты игнорируются.

    • CFSTR_DSDISPLAYSPECOPTIONS этот формат данных содержит структуру DSDISPLAYSPECOPTIONS, содержащую данные, которые будут использоваться страницами свойств, например, где загружать страницы свойств, сервер и учетные данные для использования и т. д. Более значимые члены DSDISPLAYSPECOPTIONS отображаются в следующем списке.

      offsetAttribPrefix Строка префикса атрибута определяет, где получен список страниц свойств. Это должно содержать одну из следующих строк.

      Строка префикса атрибута Description
      "admin"
      Страницы свойств загружаются из атрибута adminPropertyPages .
      "оболочка"
      Страницы свойств загружаются из атрибута shellPropertyPages .
    • CFSTR_DS_PROPSHEETCONFIG Этот формат данных содержит структуру PROPSHEETCFG, содержащую данные узла листа свойств. При размещении листа свойств более значимые члены структуры PROPSHEETCFG содержат данные, показанные в следующем списке.

      lNotifyHandle Должно быть равно нулю. HwndParentSheet Содержит дескриптор окна для получения WM_ADSPROP_NOTIFY_CHANGE сообщений, когда что-то в одном из страниц изменяется и применяется. Может иметь значение NULL , если это сообщение не нужно.

      hwndHidden Содержит дескриптор окна для получения WM_DSA_SHEET_CREATE_NOTIFY и WM_DSA_SHEET_CLOSE_NOTIFY сообщений. Задайте для этого дескриптор скрытого окна.

      wParamSheetClose содержит идентификатор, определенный приложением, который возвращается в wParam в сообщении WM_DSA_SHEET_CLOSE_NOTIFY. Если этот элемент равен нулю, сообщение WM_DSA_SHEET_CLOSE_NOTIFY не будет опубликовано в скрытом окне.

  3. Создайте экземпляр объекта CLSID_DsPropertyPages и получите интерфейс IShellExtInit для объекта. Также можно дублировать поведение объекта CLSID_DsPropertyPages . Дополнительные сведения см. в разделе "Дедупликация поведения объекта CLSID_DsPropertyPages".

  4. Инициализировать объект CLSID_DsPropertyPages путем вызова метода IShellExtInit::Initialize. Параметры pidlFolder и hkeyProgID не используются в этом методе. Параметр pdtobj — это указатель на объект данных, созданный на шаге 2. При вызове метода IShellExtInit::Initialize объект CLSID_DsPropertyPages сохранит ссылку на объект данных.

  5. Получите интерфейс IShellPropSheetExt для объекта CLSID_DsPropertyPages и вызовите метод IShellPropSheetExt::AddPages. Параметр lpfnAddPage — это адрес функции обратного вызова, которую необходимо реализовать. Ниже показан формат этой функции. Если функция обратного вызова объявлена как член класса C++, функция обратного вызова должна быть объявлена как статическая. Параметр lParam — это определяемое приложением значение, которое можно использовать для идентификации объекта, реализующего функцию обратного вызова. При вызове метода IShellPropSheetExt::AddPages объект CLSID_DsPropertyPages получит данные из объекта данных и перечислит страницы свойств, зарегистрированные для описателей отображения объекта. Затем объект CLSID_DsPropertyPages перечисляет объекты страницы свойств, вызывая метод IShellPropSheetExt::AddPages каждого объекта.

    BOOL CALLBACK AddPagesCallback(HPROPSHEETPAGE, LPARAM)
    
  6. Каждая страница, добавленная объектами страницы свойств, приведет к вызову функции обратного вызова с дескриптором на странице свойств и определяемым приложением значением. Функция обратного вызова должна хранить все передаваемые дескриптор страницы свойств. Когда метод IShellPropSheetExt::AddPages объекта CLSID_DsPropertyPages возвращается, все страницы будут добавлены через функцию обратного вызова.

  7. Заполните структуру PROPSHEETHEADER , чтобы отобразить лист свойств. Элемент phpage получает указатель на массив дескрипторов страниц, собранных функцией обратного вызова. Член nPages получает количество страниц в массиве дескрипторов страниц.

  8. Отображение листа свойств путем вызова функции PropertySheet .

Если данные на любой странице изменены, а кнопки "ОК" или "Применить" нажимаются, окно, определяемое членом hwndParentSheet структуры PROPSHEETCFG, получит сообщение WM_ADSPROP_NOTIFY_CHANGE. Это сообщение является строго уведомлением и не требует конкретных действий.

При закрытии страницы окно, определяемое членом hwndHidden структуры PROPSHEETCFG, получит сообщение WM_DSA_SHEET_CLOSE_NOTIFY. Это сообщение является строго уведомлением и не требует выполнения конкретных действий.

В некоторых случаях существующие листы свойств должны отображать вторичный лист свойств. Например, если вы отображаете лист свойств для объекта пользователя и выбираете страницу "Член ", отображается список групп, которые пользователь является членом. Если дважды щелкнуть одну из этих групп в списке, отобразится лист свойств для этой группы. Лист первичного свойства не отображает вторичный лист самостоятельно. Он запрашивает, чтобы узел отображал вторичный лист, отправив WM_DSA_SHEET_CREATE_NOTIFY сообщение в окно, определяемое элементом hwndHidden структуры PROPSHEETCFG. WParam сообщения WM_DSA_SHEET_CREATE_NOTIFY — это указатель на структуру DSA_SEC_PAGE_INFO, содержащую сведения о листе вторичных свойств и объекте, который он представляет. В ответ на это сообщение узел листа свойств должен отображать дополнительный лист свойств таким же образом, как показано выше. После обработки сообщения WM_DSA_SHEET_CREATE_NOTIFY получатель сообщений должен освободить структуру DSA_SEC_PAGE_INFO путем передачи значения wParam функции LocalFree.

Дублирование поведения объекта CLSID_DsPropertyPages

Дублирование поведения объекта CLSID_DsPropertyPages

  1. Перечисляйте значения в атрибуте adminPropertyPages или shellPropertyPages для описателя отображения для класса объектов. Каждое значение — это строка, содержащая число, а затем запятую, а затем строковое представление идентификатора класса расширения страницы свойства. Дополнительные сведения о формате страниц свойств отображают значения описателя, см. в разделе "Регистрация com-объекта страницы свойств" в описателях отображения.
  2. Преобразуйте строку идентификатора класса в CLSID с помощью функции CLSIDFromString.
  3. Сортируйте идентификаторы класса расширения по числу, который предшествует каждой строке идентификатора класса в значении атрибута. Если два числа идентичны, отсортируйте идентификаторы класса в том порядке, в каком порядке значения атрибутов получены с сервера Active Directory.
  4. Перечислите идентификаторы класса расширения, создав экземпляр каждого расширения.
  5. Для каждого расширения в порядке, отсортированного выше, вызовите IShellExtInit::Initialize с теми же сведениями, описанными на шаге 4 процедуры размещения Пользователи и компьютеры Active Directory листа свойств.
  6. Для каждого расширения в порядке, отсортированного выше, вызовите iShellPropSheetExt::AddPages с той же информацией, описанной на шаге 5 процедуры размещения Пользователи и компьютеры Active Directory листа свойств.

По возможности используйте объект CLSID_DsPropertyPages для создания страниц, а не вручную. CLSID_DsPropertyPages оптимизирован и правильно обрабатывает случаи сбоя, например, если описатель отображения недоступен для текущего языкового стандарта. Кроме того, объект CLSID_DsPropertyPages может измениться в будущем, что означает, что листы свойств могут не совпадать с теми, которые отображаются в оснастке MMC Пользователи и компьютеры Active Directory.

Специальные элементы программирования

В настоящее время следующие элементы программирования не определены в опубликованном файле заголовка. Чтобы использовать эти элементы, необходимо определить их в точном формате, показанном на конкретной эталонной странице.

Пример кода

В следующем примере кода 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