Freigeben über


Eigenschaftenblätter für Active Directory-Benutzer und -Computer

Das MMC-Snap-In für Active Directory-Benutzer und -Computer dient zum Anzeigen eines Eigenschaftenblatts für verschiedene Objekte in einem Active Directory-Server. Das Eigenschaftenblatt enthält eine oder mehrere Seiten, die zum Anzeigen und Ändern von Objektdaten verwendet werden. Verschiedene Objekttypen haben unterschiedliche Seitensätze, die für sie angezeigt werden. Mit dem MMC-Snap-In für Active Directory-Benutzer und -Computer können Drittanbieter auch benutzerdefinierte Seiten zum Eigenschaftenblatt für einen bestimmten Objekttyp hinzufügen. Weitere Informationen finden Sie unter Eigenschaftenseiten für die Verwendung mit Anzeigebezeichnern.

Einige Anwendungen, andere als das Active Directory-Benutzer- und Computer-MMC-Snap-In, müssen dem Benutzer die Möglichkeit bieten, Attribute für ein Objekt in 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 MMC-Snap-In für Active Directory-Benutzer und -Computer jede OLE COM-Anwendung das Anzeigen eines Eigenschaftenblatts für ein Objekt, das mit dem Eigenschaftenblatt identisch ist, das vom Active Directory-Snap-In "Benutzer" und "Computer MMC" für dasselbe Objekt angezeigt würde.

Weitere Informationen und ein Codebeispiel, in dem ein Eigenschaftenblatt für Active Directory-Benutzer und -Computer gehostet wird, finden Sie im PropSheetHost-Beispiel im Platform Software Development Kit (SDK).

Entwicklergruppe

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

Hosten eines Eigenschaftenblatts für Active Directory-Benutzer und -Computer

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

  1. Erstellen Sie ein Fenster, das zum Verarbeiten von Nachrichten verwendet werden kann. Dies kann ein vorhandenes Fenster oder ein Spezielles Fenster sein. Dies wird als ausgeblendetes Fensterbezeichnet.

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

    • CFSTR_DSOBJECTNAMES Dieses Datenformat enthält eine DSOBJECTNAMES-, die 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 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 Member 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 Mitglieder der DSDISPLAYSPECOPTIONS- werden in der folgenden Liste angezeigt.

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

      Attributpräfixzeichenfolge Beschreibung
      "Admin"
      Die Eigenschaftenseiten werden aus dem attribut adminPropertyPages geladen.
      "Shell"
      Die Eigenschaftenseiten werden aus dem shellPropertyPages Attribut geladen.
    • CFSTR_DS_PROPSHEETCONFIG Dieses Datenformat enthält eine PROPSHEETCFG- Struktur, die Hostdaten des Eigenschaftenblatts enthält. Beim Hosten eines Eigenschaftenblatts enthalten die in der folgenden Liste angezeigten Daten die wichtigsten Elemente der PROPSHEETCFG- Struktur.

      lNotifyHandle Muss null sein. hwndParentSheet Enthält das Handle des Fensters, um WM_ADSPROP_NOTIFY_CHANGE Nachrichten zu empfangen, wenn sich etwas in einer der Seiten ändert und angewendet wird. Kann NULL- werden, wenn diese Nachricht nicht gewünscht wird.

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

      wParamSheetClose Enthält einen anwendungsdefinierten Bezeichner, der in der wParam- in der WM_DSA_SHEET_CLOSE_NOTIFY Nachricht zurückgegeben wird. Wenn dieses Element null ist, wird die WM_DSA_SHEET_CLOSE_NOTIFY Nachricht nicht im ausgeblendeten Fenster gepostet.

  3. Erstellen Sie eine Instanz 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 Duplicating the Behavior of the CLSID_DsPropertyPages Object.

  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 wird unten angezeigt. Wenn die Rückruffunktion als Mitglied einer C++-Klasse deklariert wird, muss die Rückruffunktion als statischendeklariert werden. Der lParam-Parameter ist ein anwendungsdefinierter Wert, mit dem das Objekt identifiziert werden kann, das die Rückruffunktion implementiert. Wenn die IShellPropSheetExt::AddPages--Methode aufgerufen wird, ruft das CLSID_DsPropertyPages-Objekt die Daten aus dem Datenobjekt ab und zählt die Eigenschaftenseiten auf, die für die Objektanzeigebezeichner registriert sind. Das CLSID_DsPropertyPages-Objekt enumeriert dann die Eigenschaftenseitenobjekte 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 auf der Eigenschaftenseite und dem anwendungsdefinierten Wert aufgerufen wird. Ihre Rückruffunktion muss jedes übergebene Eigenschaftenseitenhandle speichern. Wenn die IShellPropSheetExt::AddPages-methode des CLSID_DsPropertyPages Objekts zurückgegeben wird, wurden alle Seiten über die Rückruffunktion hinzugefügt.

  7. Füllen Sie eine PROPSHEETHEADER- Struktur aus, um das Eigenschaftenblatt anzuzeigen. Das phpage Member empfängt einen Zeiger auf ein Array von Seitenhandles, die von Ihrer Rückruffunktion erfasst wurden. Der nPages Member 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 Mitglied der PROPSHEETCFG- Struktur identifizierte Fenster eine WM_ADSPROP_NOTIFY_CHANGE Nachricht. Diese Nachricht ist ausschließlich eine Benachrichtigung und erfordert keine bestimmte Aktion.

Wenn die Seite geschlossen wird, erhält das durch das hwndHidden Mitglied der PROPSHEETCFG-Struktur identifizierte Fenster eine WM_DSA_SHEET_CLOSE_NOTIFY Nachricht. Diese Nachricht ist streng eine Benachrichtigung und erfordert keine bestimmte 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 das Mitglied von Seite auswählen, wird eine Liste der 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. Es fordert an, dass der Host das sekundäre Blatt anzeigt, indem eine WM_DSA_SHEET_CREATE_NOTIFY Nachricht an das Fenster gesendet wird, das vom hwndHidden Mitglied der PROPSHEETCFG- Struktur identifiziert wird. Die wParam- der WM_DSA_SHEET_CREATE_NOTIFY Nachricht ist ein Zeiger auf eine DSA_SEC_PAGE_INFO Struktur, die Informationen über das sekundäre Eigenschaftenblatt und das objekt enthält, das sie darstellt. Als Reaktion auf diese Meldung muss der Eigenschaftenblatthost das sekundäre Eigenschaftenblatt auf die gleiche Weise anzeigen wie oben dargestellt. Nach der Verarbeitung der WM_DSA_SHEET_CREATE_NOTIFY Nachricht muss der Nachrichtenempfänger die DSA_SEC_PAGE_INFO Struktur freigeben, indem der wParam- Wert an die funktion LocalFree übergeben wird.

Duplizieren des Verhaltens des CLSID_DsPropertyPages-Objekts

So duplizieren Sie das Verhalten des CLSID_DsPropertyPages-Objekts

  1. Aufzählen der Werte in den adminPropertyPages oder shellPropertyPages Attribut für den Anzeigebezeichner für die Objektklasse. 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 Eigenschaftenseiten mit Anzeigebezeichnerwerten finden Sie unter Registrieren des COM-Objekts der Eigenschaftsseite in einem Anzeigebezeichner.
  2. Konvertieren Sie jede Klassenbezeichnerzeichenfolge in eine CLSID- mithilfe der CLSIDFromString--Funktion.
  3. Sortieren Sie die Bezeichner der Erweiterungsklasse nach der Zahl, die jeder Klassenbezeichnerzeichenfolge im Attributwert vorausgeht. Wenn zwei Zahlen identisch sind, sortieren Sie die Klassenbezeichner in der Reihenfolge, in der die Attributwerte vom Active Directory-Server abgerufen werden.
  4. Aufzählen der Erweiterungsklassenbezeichner und Erstellen einer Instanz jeder Erweiterung.
  5. Rufen Sie für jede Erweiterung in der oben sortierten Reihenfolge die IShellExtInit::Initialize mit den gleichen Informationen auf, die in Schritt 4 der Prozedur für das Hosten von Active Directory-Benutzern und -Computern im Eigenschaftenblatt beschrieben sind.
  6. Rufen Sie für jede Erweiterung in der oben sortierten Reihenfolge die IShellPropSheetExt::AddPages mit den gleichen Informationen auf, die in Schritt 5 der Prozedur "Hosten von Active Directory-Benutzern und -Computern" beschrieben sind.

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

Spezielle Programmierungselemente

Derzeit sind die folgenden Programmierelemente nicht in einer veröffentlichten Headerdatei definiert. Um diese Elemente zu verwenden, 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, diese Elemente zu definieren, die auch dann weiterhin funktionieren, wenn diese Elemente in einer veröffentlichten Headerdatei in Zukunft definiert sind.

#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