Freigeben über


Active Directory-Benutzer und -Computer Eigenschaftenblätter

Das Active Directory-Benutzer und -Computer MMC-Snap-Ins dient zum Anzeigen eines Eigenschaftenblatts für verschiedene Objekte auf einem Active Directory-Server. Das Eigenschaftenblatt enthält eine oder mehrere Seiten, die zum Anzeigen und Ändern von Objektdaten verwendet werden. Für verschiedene Objekttypen werden unterschiedliche Seitensätze angezeigt. Das Active Directory-Benutzer und -Computer MMC-Snap-Ins ermöglicht es Drittanbietern auch, dem Eigenschaftenblatt benutzerdefinierte Seiten für einen bestimmten Objekttyp hinzuzufügen. Weitere Informationen finden Sie unter Eigenschaftenseiten für die Verwendung mit Anzeigebezeichnern.

Einige Anwendungen, mit Ausnahme des Active Directory-Benutzer und -Computer MMC-Snap-Ins, müssen dem Benutzer die Möglichkeit bieten, Attribute für ein Objekt auf einem Active Directory-Server anzuzeigen und zu bearbeiten. Die Anwendung könnte eigene Eigenschaftenblätter implementieren, aber es ist besser, eine konsistente Benutzeroberfläche anzubieten, um Verwirrung und Lernzeit zu reduzieren. Glücklicherweise ermöglicht das Active Directory-Benutzer und -Computer MMC-Snap-In jeder OLE COM-Anwendung das Anzeigen eines Eigenschaftenblatts für ein Objekt, das mit dem Eigenschaftenblatt identisch ist, das vom Active Directory-Benutzer und -Computer MMC-Snap-In für dasselbe Objekt angezeigt wird.

Weitere Informationen und ein Codebeispiel, das ein Active Directory-Benutzer und -Computer Eigenschaftenblatt hostet, finden Sie im PropSheetHost-Beispiel im Platform Software Development Kit (SDK).

Entwicklerzielgruppe

In dieser Dokumentation wird davon ausgegangen, dass der Leser mit dem COM-Vorgang und der Komponentenentwicklung mit C++ vertraut ist. Derzeit ist es nicht möglich, eine Active Directory-Eigenschaftenblatterweiterung mit Visual Basic zu erstellen.

Hosten eines Active Directory-Benutzer und -Computer Eigenschaftenblatts

So zeigen Sie ein Eigenschaftenblatt für ein Objekt auf einem Active Directory-Server an

  1. Erstellen Sie ein Fenster, das zum Verarbeiten von Nachrichten verwendet werden kann. Dies kann ein vorhandenes Fenster oder ein Fenster für spezielle Zwecke sein. Dies wird als ausgeblendetes Fenster bezeichnet.

  2. Erstellen Sie ein OLE COM-Objekt, das von IDataObject abgeleitet wird. Dieses Datenobjekt muss die folgenden Datenformate unterstützen:

    • CFSTR_DSOBJECTNAMES Dieses Datenformat enthält einen DSOBJECTNAMES-Wert , der das Objekt identifiziert, auf das das Eigenschaftenblatt angewendet wird. Beim Hosten eines Eigenschaftenblatts werden die wichtigeren Elemente der DSOBJECTNAMES-Struktur in der folgenden Liste angezeigt.

      clsidNamespace Reserviert. Legen Sie dies hier auf eine GUID für Ihre Anwendung fest, falls sie in Zukunft verwendet wird.

      aObjects Enthält ein Array von DSBOJECT-Strukturen . Jede DSBOJECT-Struktur stellt ein einzelnes Verzeichnisobjekt dar. Das cItems-Element enthält die Anzahl der Elemente im Array. Es wird nur das erste Objekt in diesem Array verwendet. Andere Objekte werden ignoriert.

    • CFSTR_DSDISPLAYSPECOPTIONS Dieses Datenformat enthält eine DSDISPLAYSPECOPTIONS-Struktur , die Daten enthält, die von den Eigenschaftenseiten verwendet werden, z. B. wo die Eigenschaftenseiten geladen werden sollen, der Server und die zu verwendenden Anmeldeinformationen usw. Die wichtigeren Member von DSDISPLAYSPECOPTIONS werden in der folgenden Liste angezeigt.

      offsetAttribPrefix Die Attributpräfixzeichenfolge bestimmt, wo die Liste der Eigenschaftenseiten abgerufen wird. Diese muss eine der folgenden Zeichenfolgen enthalten.

      Attributpräfixzeichenfolge BESCHREIBUNG
      "Administrator"
      Die Eigenschaftenseiten werden aus dem adminPropertyPages-Attribut geladen.
      "Shell"
      Die Eigenschaftenseiten werden aus dem shellPropertyPages-Attribut geladen.
    • CFSTR_DS_PROPSHEETCONFIG Dieses Datenformat enthält eine PROPSHEETCFG-Struktur , die Eigenschaftenblatt-Hostdaten enthält. Beim Hosten eines Eigenschaftenblatts enthalten die wichtigeren Elemente der PROPSHEETCFG-Struktur die in der folgenden Liste dargestellten Daten.

      lNotifyHandle Muss null sein. hwndParentSheet Enthält das Handle des Fensters zum Empfangen WM_ADSPROP_NOTIFY_CHANGE Nachrichten, wenn sich etwas auf einer der Seiten ändert und angewendet wird. Kann NULL sein, wenn diese Meldung nicht gewünscht wird.

      hwndHidden Enthält das Handle des Fensters zum Empfangen WM_DSA_SHEET_CREATE_NOTIFY und WM_DSA_SHEET_CLOSE_NOTIFY Nachrichten. Legen Sie dies auf das Handle Ihres ausgeblendeten Fensters fest.

      wParamSheetClose Enthält einen anwendungsdefinierten Bezeichner, der im wParam in der WM_DSA_SHEET_CLOSE_NOTIFY Meldung zurückgegeben wird. Wenn dieser Member null ist, wird die WM_DSA_SHEET_CLOSE_NOTIFY Meldung nicht im ausgeblendeten Fenster veröffentlicht.

  3. Erstellen Sie eine instance des CLSID_DsPropertyPages-Objekts, und rufen Sie die IShellExtInit-Schnittstelle für das Objekt ab. Es ist auch möglich, das Verhalten des CLSID_DsPropertyPages-Objekts zu duplizieren. Weitere Informationen finden Sie unter Duplizieren des Verhaltens des CLSID_DsPropertyPages-Objekts.

  4. Initialisieren Sie das CLSID_DsPropertyPages-Objekt , indem Sie die IShellExtInit::Initialize-Methode aufrufen. Die Parameter pidlFolder und hkeyProgID werden in dieser Methode nicht verwendet. Der pdtobj-Parameter ist der Zeiger auf das in Schritt 2 erstellte Datenobjekt. Wenn die IShellExtInit::Initialize-Methode aufgerufen wird, speichert das CLSID_DsPropertyPages-Objekt einen Verweis auf das Datenobjekt.

  5. Rufen Sie die IShellPropSheetExt-Schnittstelle für das CLSID_DsPropertyPages-Objekt ab, und rufen Sie die IShellPropSheetExt::AddPages-Methode auf. Der Parameter lpfnAddPage ist die Adresse einer Rückruffunktion, die Sie implementieren müssen. Das Format dieser Funktion ist unten dargestellt. Wenn die Rückruffunktion als Member einer C++-Klasse deklariert wird, muss die Rückruffunktion als statisch deklariert werden. Der lParam-Parameter ist ein anwendungsdefinierter Wert, der verwendet werden kann, um das Objekt zu identifizieren, das die Rückruffunktion implementiert. Wenn die IShellPropSheetExt::AddPages-Methode aufgerufen wird, ruft das CLSID_DsPropertyPages-Objekt die Daten aus dem Datenobjekt ab und listet die Eigenschaftenseiten auf, die für die Objektanzeigespezifizierer registriert sind. Das CLSID_DsPropertyPages-Objekt listet dann die Eigenschaftenseitenobjekte auf und ruft die IShellPropSheetExt::AddPages-Methode jedes Objekts auf.

    BOOL CALLBACK AddPagesCallback(HPROPSHEETPAGE, LPARAM)
    
  6. Jede Seite, die von den Eigenschaftenseitenobjekten hinzugefügt wird, führt dazu, dass Ihre Rückruffunktion mit dem Handle für die Eigenschaftenseite und dem von der Anwendung definierten Wert aufgerufen wird. Ihre Rückruffunktion muss jedes übergebene Eigenschaftenseitenhandle speichern. Wenn die IShellPropSheetExt::AddPages-Methode des CLSID_DsPropertyPages -Objekts zurückgibt, wurden alle Seiten über die Rückruffunktion hinzugefügt.

  7. Füllen Sie eine PROPSHEETHEADER-Struktur aus, um das Eigenschaftenblatt anzuzeigen. Das phpage-Element empfängt einen Zeiger auf ein Array von Seitenhandles, die von Ihrer Rückruffunktion erfasst wurden. Das nPages-Element empfängt die Anzahl der Seiten im Seitenhandlearray.

  8. Zeigen Sie das Eigenschaftenblatt an, indem Sie die PropertySheet-Funktion aufrufen.

Wenn die Daten auf einer Seite geändert werden und auf die Schaltflächen OK oder Anwenden geklickt werden, erhält das durch das hwndParentSheet-Element der PROPSHEETCFG-Struktur identifizierte Fenster eine WM_ADSPROP_NOTIFY_CHANGE Meldung. Diese Nachricht ist ausschließlich eine Benachrichtigung und erfordert keine spezifische Aktion.

Wenn die Seite geschlossen wird, erhält das vom hwndHidden-Element der PROPSHEETCFG-Struktur identifizierte Fenster eine WM_DSA_SHEET_CLOSE_NOTIFY-Nachricht . Diese Nachricht ist ausschließlich eine Benachrichtigung und erfordert keine spezifische Aktion.

In einigen Fällen müssen die vorhandenen Eigenschaftenblätter ein sekundäres Eigenschaftenblatt anzeigen. Wenn Sie beispielsweise das Eigenschaftenblatt für ein Benutzerobjekt anzeigen und die Seite Member of auswählen, wird eine Liste von Gruppen angezeigt, in denen der Benutzer Mitglied ist. Wenn Sie in der Liste auf eine dieser Gruppen doppelklicken, wird das Eigenschaftenblatt für diese Gruppe angezeigt. Das primäre Eigenschaftenblatt zeigt das sekundäre Blatt nicht selbst an. Der Host fordert an, dass das sekundäre Blatt angezeigt wird, indem eine WM_DSA_SHEET_CREATE_NOTIFY-Nachricht an das Fenster gesendet wird, das vom hwndHidden-Element der PROPSHEETCFG-Struktur identifiziert wird. Die wParam der WM_DSA_SHEET_CREATE_NOTIFY Meldung ist ein Zeiger auf eine DSA_SEC_PAGE_INFO-Struktur , die Informationen zum sekundären Eigenschaftenblatt und zum Objekt enthält, das es darstellt. Als Reaktion auf diese Meldung muss der Eigenschaftenblatthost das sekundäre Eigenschaftenblatt auf die gleiche Weise wie oben gezeigt anzeigen. Nach der Verarbeitung der WM_DSA_SHEET_CREATE_NOTIFY Nachricht muss der Nachrichtenempfänger die DSA_SEC_PAGE_INFO-Struktur freigeben, indem er den wParam-Wert an die LocalFree-Funktion übergibt .

Duplizieren des Verhaltens des CLSID_DsPropertyPages-Objekts

So duplizieren Sie das Verhalten des CLSID_DsPropertyPages-Objekts

  1. Enumerate the values in the adminPropertyPages or shellPropertyPages attribute for the display specifier for the object class. Jeder Wert ist eine Zeichenfolge, die eine Zahl enthält, gefolgt von einem Komma, gefolgt von der Zeichenfolgendarstellung des Klassenbezeichners der Eigenschaftenseitenerweiterung. Weitere Informationen zum Format der Anzeigebezeichnerwerte der Eigenschaftenseiten finden Sie unter Registrieren des COM-Objekts der Eigenschaftenseite in einem Anzeigespezifizierer.
  2. Konvertieren Sie jede Klassenbezeichnerzeichenfolge mithilfe der CLSIDFromString-Funktion in eine CLSID.
  3. Sortieren Sie die Erweiterungsklassenbezeichner nach der Zahl, die jeder Klassenbezeichnerzeichenfolge im Attributwert vorangestellt ist. Wenn zwei Zahlen identisch sind, sortieren Sie die Klassenbezeichner in der Reihenfolge, in der die Attributwerte vom Active Directory-Server abgerufen werden.
  4. Enumerieren Sie die Erweiterungsklassenbezeichner, und erstellen Sie eine instance jeder Erweiterung.
  5. Rufen Sie für jede Erweiterung in der oben sortierten Reihenfolge die IShellExtInit::Initialize der Erweiterung mit den gleichen Informationen auf, die in Schritt 4 der Prozedur Hosting an Active Directory-Benutzer und -Computer Property Sheet beschrieben sind.
  6. Rufen Sie für jede Erweiterung in der oben sortierten Reihenfolge die IShellPropSheetExt::AddPages der Erweiterung mit den gleichen Informationen auf, die in Schritt 5 der Prozedur Hosten eines Active Directory-Benutzer und -Computer Eigenschaftenblatts beschrieben sind.

Verwenden Sie nach Möglichkeit das CLSID_DsPropertyPages-Objekt , um die Seiten zu erstellen, anstatt dies manuell zu tun. Die CLSID_DsPropertyPages wurde optimiert und behandelt Fehlerfälle ordnungsgemäß, z. B. wenn für das aktuelle Gebietsschema kein Anzeigespezifizierer verfügbar ist. Außerdem kann sich die CLSID_DsPropertyPages -Objekts in Zukunft ändern, was bedeutet, dass Ihre Eigenschaftenblätter möglicherweise nicht genau mit denen übereinstimmen, die vom Active Directory-Benutzer und -Computer MMC-Snap-In angezeigt werden.

Spezielle Programmierelemente

Derzeit sind die folgenden Programmierelemente nicht in einer veröffentlichten Headerdatei definiert. Um diese Elemente verwenden zu können, müssen Sie sie selbst im genauen Format definieren, das auf der jeweiligen Referenzseite angezeigt wird.

Beispielcode

Das folgende C++-Codebeispiel zeigt eine sichere Möglichkeit zum Definieren dieser Elemente, die weiterhin funktionieren, auch wenn diese Elemente in Zukunft in einer veröffentlichten Headerdatei definiert werden.

#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