다음을 통해 공유


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 사용자 및 컴퓨터 속성 시트를 호스트하는 코드 예제에 대한 자세한 내용은 SDK(플랫폼 소프트웨어 개발 키트)의 PropSheetHost 샘플을 참조하세요.

개발자 대상

이 설명서에서는 판독기가 C++를 사용한 COM 작업 및 구성 요소 개발에 익숙하다고 가정합니다. 현재 Visual Basic을 사용하여 Active Directory 속성 시트 확장을 만들 수 없습니다.

Active Directory 사용자 및 컴퓨터 속성 시트 호스팅

Active Directory 서버에서 개체의 속성 시트를 표시하려면

  1. 메시지를 처리하는 데 사용할 수 있는 창을 만듭니다. 기존 창 또는 특수 용도 창일 수 있습니다. 이를 숨겨진 창이라고 합니다.

  2. IDataObject에서 파생된 OLE COM 개체를 만듭니다. 이 데이터 개체는 다음 데이터 형식을 지원해야 합니다.

    • CFSTR_DSOBJECTNAMES 이 데이터 형식에는 속성 시트가 적용되는 개체를 식별하는 DSOBJECTNAMES 가 포함되어 있습니다. 속성 시트를 호스팅할 때 DSOBJECTNAMES 구조체의 더 중요한 멤버가 다음 목록에 표시됩니다.

      clsidNamespace 예약. 나중에 사용되는 경우 여기에서 애플리케이션의 GUID로 설정합니다.

      aObjectsDSBOJECT 구조체의 배열을 포함합니다. 각 DSBOJECT 구조체는 단일 디렉터리 개체를 나타냅니다. 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 개체의 instance 만들고 개체에 대한 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 메시지가 표시됩니다. 이 메시지는 엄격하게 알림이며 특정 작업을 수행할 필요가 없습니다.

경우에 따라 기존 속성 시트는 보조 속성 시트를 표시해야 합니다. 예를 들어 사용자 개체의 속성 시트를 표시하고 구성원 페이지를 선택하면 사용자가 멤버인 그룹 목록이 표시됩니다. 목록에서 이러한 그룹 중 하나를 두 번 클릭하면 해당 그룹의 속성 시트가 표시됩니다. 기본 속성 시트는 보조 시트 자체를 표시하지 않습니다. 호스트가 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. CLSIDFromString 함수를 사용하여 각 클래스 식별자 문자열을 CLSID로 변환합니다.
  3. 확장 클래스 식별자를 특성 값의 각 클래스 식별자 문자열 앞에 오는 숫자로 정렬합니다. 두 숫자가 동일한 경우 Active Directory 서버에서 특성 값을 가져오는 순서대로 클래스 식별자를 정렬합니다.
  4. 확장 클래스 식별자를 열거하여 각 확장의 instance 만듭니다.
  5. 각 확장에 대해 위에서 정렬된 순서대로 확장의 IShellExtInit::Initialize를 Active Directory 사용자 및 컴퓨터 속성 시트 호스팅 프로시저의 4단계에 설명된 것과 동일한 정보를 사용하여 호출합니다.
  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