Finestre delle proprietà Utenti e computer di Active Directory
Lo snap-in MMC Utenti e computer di Active Directory è progettato per visualizzare una finestra delle proprietà per vari oggetti in un server Active Directory. La finestra delle proprietà contiene una o più pagine utilizzate per visualizzare e modificare i dati dell'oggetto. Per i diversi tipi di oggetto sono visualizzati diversi set di pagine. Lo snap-in MMC Utenti e computer di Active Directory consente anche ai fornitori di terze parti di aggiungere pagine personalizzate alla finestra delle proprietà per un tipo specifico di oggetto. Per altre informazioni, vedere Pagine delle proprietà per l'uso con identificatori di visualizzazione.
Alcune applicazioni, diverse dallo snap-in MMC Utenti e computer di Active Directory, devono fornire all'utente la possibilità di visualizzare e modificare gli attributi per un oggetto in un server Active Directory. L'applicazione potrebbe implementare le proprie finestre delle proprietà, ma è preferibile offrire un'interfaccia utente coerente per ridurre la confusione e il tempo di apprendimento. Fortunatamente, lo snap-in MMC Utenti e computer di Active Directory consente a qualsiasi applicazione OLE COM di visualizzare una finestra delle proprietà per un oggetto identico alla finestra delle proprietà che verrebbe visualizzata dallo snap-in MMC Utenti e computer di Active Directory per lo stesso oggetto.
Per altre informazioni e un esempio di codice che ospita una finestra delle proprietà Utenti e computer di Active Directory, vedere l'esempio PropSheetHost in Platform Software Development Kit (SDK).
Gruppo di destinatari per sviluppatori
Questa documentazione presuppone che il lettore abbia familiarità con lo sviluppo di componenti e operazioni COM con C++. Attualmente non è possibile creare un'estensione della finestra delle proprietà di Active Directory usando Visual Basic.
Hosting di una finestra delle proprietà di Utenti e computer di Active Directory
Per visualizzare una finestra delle proprietà per un oggetto in un server Active Directory
Creare una finestra che può essere usata per elaborare i messaggi. Può trattarsi di una finestra esistente o di una finestra per scopi speciali. Questa operazione è nota come finestra nascosta.
Creare un oggetto OLE COM derivato da IDataObject. Questo oggetto dati deve supportare i formati di dati seguenti:
CFSTR_DSOBJECTNAMES Questo formato di dati contiene un DSOBJECTNAMES che identifica l'oggetto a cui si applica la finestra delle proprietà. Quando si ospita una finestra delle proprietà, nell'elenco seguente vengono visualizzati i membri più significativi della struttura DSOBJECTNAMES .
clsidNamespace Riservato. Impostare questo valore su un GUID per l'applicazione, nel caso in cui venga usato in futuro.
aObjects Contiene una matrice di strutture DSBOJECT . Ogni struttura DSBOJECT rappresenta un singolo oggetto directory. Il membro cItems contiene il numero di elementi nella matrice. Viene usato solo il primo oggetto in questa matrice. Gli altri oggetti vengono ignorati.
CFSTR_DSDISPLAYSPECOPTIONS Questo formato di dati contiene una struttura DSDISPLAYSPECOPTIONS che contiene dati che verranno utilizzati dalle pagine delle proprietà, ad esempio dove caricare le pagine delle proprietà da, dal server e dalle credenziali da utilizzare e così via. I membri più significativi di DSDISPLAYSPECOPTIONS sono visualizzati nell'elenco seguente.
offsetAttribPrefix La stringa del prefisso dell'attributo determina dove viene ottenuto l'elenco delle pagine delle proprietà. Deve contenere una delle stringhe seguenti.
Stringa del prefisso dell'attributo Descrizione "admin" Le pagine delle proprietà vengono caricate dall'attributo adminPropertyPages . "shell" Le pagine delle proprietà vengono caricate dall'attributo shellPropertyPages . CFSTR_DS_PROPSHedizione Enterprise TCONFIG Questo formato di dati contiene una struttura PROPSH edizione Enterprise TCFG che contiene i dati dell'host della finestra delle proprietà. Quando si ospita una finestra delle proprietà, i membri più significativi della struttura PROPSH edizione Enterprise TCFG contengono i dati illustrati nell'elenco seguente.
lNotifyHandle Deve essere zero. hwndParentSheet Contiene l'handle della finestra per ricevere WM_ADSPROP_NOTIFY_CHANGE messaggi quando viene modificato qualcosa in una delle pagine e viene applicato. Può essere NULL se il messaggio non è desiderato.
hwndHidden contiene l'handle della finestra per ricevere WM_DSA_SHedizione EnterpriseT_CREATE_NOTIFY e WM_DSA_SHedizione EnterpriseT_CLOedizione Standard_NOTIFY messaggi. Impostarlo sull'handle della finestra nascosta.
wParamSheetClose Contiene un identificatore definito dall'applicazione restituito nel wParam nel messaggio WM_DSA_SHedizione EnterpriseT_CLOedizione Standard_NOTIFY. Se questo membro è zero, il messaggio di WM_DSA_SHedizione EnterpriseT_CLOedizione Standard_NOTIFY non verrà inviato alla finestra nascosta.
Creare un'istanza dell'oggetto CLSID_DsPropertyPages e ottenere l'interfaccia IShellExtInit per l'oggetto . È anche possibile duplicare il comportamento dell'oggetto CLSID_DsPropertyPages . Per altre informazioni, vedere Duplicazione del comportamento dell'oggetto CLSID_DsPropertyPages.
Inizializzare l'oggetto CLSID_DsPropertyPages chiamando il metodo IShellExtInit::Initialize. I parametri pidlFolder e hkeyProgID non vengono usati in questo metodo. Il parametro pdtobj è il puntatore all'oggetto dati creato nel passaggio 2. Quando viene chiamato il metodo IShellExtInit::Initialize , l'oggetto CLSID_DsPropertyPages salverà un riferimento all'oggetto dati.
Ottenere l'interfaccia IShellPropSheetExt per l'oggetto CLSID_DsPropertyPages e chiamare il metodo IShellPropSheetExt::AddPages. Il parametro lpfnAddPage è l'indirizzo di una funzione di callback che è necessario implementare. Il formato di questa funzione è illustrato di seguito. Se la funzione di callback viene dichiarata come membro di una classe C++, la funzione di callback deve essere dichiarata come statica. Il parametro lParam è un valore definito dall'applicazione che può essere usato per identificare l'oggetto che implementa la funzione di callback. Quando viene chiamato il metodo IShellPropSheetExt::AddPages , l'oggetto CLSID_DsPropertyPages otterrà i dati dall'oggetto dati ed enumera le pagine delle proprietà registrate per gli identificatori di visualizzazione dell'oggetto. L'oggetto CLSID_DsPropertyPages enumererà quindi gli oggetti pagina delle proprietà, chiamando il metodo IShellPropSheetExt::AddPages di ogni oggetto.
BOOL CALLBACK AddPagesCallback(HPROPSHEETPAGE, LPARAM)
Ogni pagina aggiunta dagli oggetti della pagina delle proprietà comporterà la chiamata della funzione di callback con l'handle alla pagina delle proprietà e al valore definito dall'applicazione. La funzione di callback deve archiviare ogni handle di pagina delle proprietà passato. Quando viene restituito il metodo IShellPropSheetExt::AddPages dell'oggetto CLSID_DsPropertyPages, tutte le pagine verranno aggiunte tramite la funzione di callback.
Compilare una struttura PROPSH edizione Enterprise THEADER per visualizzare la finestra delle proprietà. Il membro phpage riceve un puntatore a una matrice di handle di pagina raccolti dalla funzione di callback. Il membro nPages riceve il numero di pagine nella matrice di handle di pagina.
Visualizzare la finestra delle proprietà chiamando la funzione PropertySheet .
Se i dati in una pagina vengono modificati e si fa clic sui pulsanti OK o Applica, la finestra identificata dal membro hwndParentSheet della struttura PROPSH edizione Enterprise TCFG riceverà un messaggio di WM_ADSPROP_NOTIFY_CHANGE. Questo messaggio è strettamente una notifica e non richiede alcuna azione specifica.
Quando la pagina viene chiusa, la finestra identificata dal membro hwndHidden della struttura PROPSH edizione Enterprise TCFG riceverà un messaggio WM_DSA_SHedizione EnterpriseT_CLOedizione Standard_NOTIFY. Questo messaggio è strettamente una notifica e non richiede alcuna azione specifica da eseguire.
In alcuni casi, le finestre delle proprietà esistenti dovranno visualizzare una finestra delle proprietà secondaria. Ad esempio, se si visualizza la finestra delle proprietà per un oggetto utente e si seleziona la pagina Membro di , verrà visualizzato un elenco di gruppi di cui l'utente è membro. Se si fa doppio clic su uno di questi gruppi nell'elenco, verrà visualizzata la finestra delle proprietà per tale gruppo. La finestra delle proprietà primaria non visualizza il foglio secondario da solo. Richiede che l'host visualizzi il foglio secondario inviando un messaggio di WM_DSA_SHedizione EnterpriseT_CREATE_NOTIFY alla finestra identificata dal membro hwndHidden della struttura PROPSH edizione Enterprise TCFG. WParam del messaggio di WM_DSA_SHedizione EnterpriseT_CREATE_NOTIFY è un puntatore a una struttura DSA_edizione StandardC_PAGE_INFO che contiene informazioni sulla finestra delle proprietà secondaria e sull'oggetto rappresentato. In risposta a questo messaggio, l'host della finestra delle proprietà deve visualizzare la finestra delle proprietà secondaria nello stesso modo illustrato in precedenza. Dopo l'elaborazione del messaggio WM_DSA_SHedizione EnterpriseT_CREATE_NOTIFY, il destinatario del messaggio deve liberare la struttura DSA_edizione StandardC_PAGE_INFO passando il valore wParam alla funzione LocalFree.
Duplicazione del comportamento dell'oggetto CLSID_DsPropertyPages
Per duplicare il comportamento dell'oggetto CLSID_DsPropertyPages
- Enumerare i valori nell'attributo adminPropertyPages o shellPropertyPages per l'identificatore di visualizzazione per la classe oggetto. Ogni valore è una stringa che contiene un numero, seguito da una virgola, seguita dalla rappresentazione di stringa dell'identificatore di classe dell'estensione della pagina delle proprietà. Per altre informazioni sul formato dei valori identificatori di visualizzazione delle pagine delle proprietà, vedere Registrazione dell'oggetto COM pagina delle proprietà in un identificatore di visualizzazione.
- Convertire ogni stringa di identificatore di classe in un CLSID usando la funzione CLSIDFromString.
- Ordinare gli identificatori della classe di estensione in base al numero che precede ogni stringa di identificatore di classe nel valore dell'attributo. Se due numeri sono identici, ordinare gli identificatori di classe nell'ordine in cui i valori dell'attributo vengono ottenuti dal server Active Directory.
- Enumerare gli identificatori della classe di estensione, creando un'istanza di ogni estensione.
- Per ogni estensione, nell'ordine indicato in precedenza, chiamare IShellExtInit::Initialize dell'estensione con le stesse informazioni descritte nel passaggio 4 della routine Hosting di una finestra delle proprietà Utenti e computer di Active Directory.
- Per ogni estensione, nell'ordine indicato in precedenza, chiamare IShellPropSheetExt::AddPages dell'estensione con le stesse informazioni descritte nel passaggio 5 della routine Hosting di una finestra delle proprietà Utenti e computer di Active Directory.
Se possibile, utilizzare l'oggetto CLSID_DsPropertyPages per creare le pagine anziché eseguire questa operazione manualmente. Il CLSID_DsPropertyPages è stato ottimizzato e gestirà correttamente i casi di errore, ad esempio quando non è disponibile alcun identificatore di visualizzazione per le impostazioni locali correnti. Inoltre, l'oggetto CLSID_DsPropertyPages può cambiare in futuro, il che significa che le finestre delle proprietà potrebbero non corrispondere esattamente a quelle visualizzate dallo snap-in MMC Utenti e computer di Active Directory.
Elementi di programmazione speciali
Attualmente, gli elementi di programmazione seguenti non sono definiti in un file di intestazione pubblicato. Per usare questi elementi, è necessario definirli in modo autonomo nel formato esatto illustrato nella pagina di riferimento specifica.
- CFSTR_DS_PROPSHedizione Enterprise TCONFIG
- PROPSH edizione Enterprise TCFG
- WM_DSA_SHedizione EnterpriseT_CLOedizione Standard_NOTIFY
- WM_DSA_SHedizione EnterpriseT_CREATE_NOTIFY
- DSA_edizione StandardC_PAGE_INFO
Codice di esempio
L'esempio di codice C++ seguente illustra un modo sicuro per definire questi elementi che continueranno a funzionare anche se questi elementi sono definiti in un file di intestazione pubblicato in futuro.
#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