Supporto per l'associazione anticipata
L'esempio di codice seguente presenta uno scenario con supporto dell'associazione anticipata sul posto.
Dim x as IADsUser
Dim y as IADsExt1
Dim z as IADsExt2
Set x = GetObject("LDAP://CN=JeffSmith, OU=Sales,
DC=Fabrikam,DC=COM")
x.SetPassword("newPassword")
Set y = x
y.MyNewMethod( "\\srv\public")
y.MyProperty = "Hello World"
Set z = y
z.OtherMethod()
z.OtherProperty = 4362
Debug.Print x.LastName
Set z = GetObject("LDAP://CN=Jeff,OU=Engr,
DC=Fabrikam,DC=COM")
z.OtherProperty = 5323
In questo esempio di codice, due componenti di estensione estendono un oggetto utente . Ogni estensione pubblica la propria interfaccia. Ogni estensione non riconosce l'altra interfaccia di estensione; solo ADSI riconosce l'esistenza di entrambe le estensioni. Ogni estensione delega i propri IUnknown ad ADSI. ADSI funge da aggregatore per entrambe le estensioni e per qualsiasi altra estensione futura. L'esecuzione di query su un'interfaccia da qualsiasi estensione o da ADSI restituisce lo stesso risultato coerente.
La procedura seguente descrive come creare un'estensione.
Passaggio 1: Aggiungere aggregazione al componente
Seguire la specifica COM per aggiungere aggregazioni al componente. In sintesi, è necessario accettare le richieste pUnknown al componente durante CreateInstance e delegare pUnknown all'IUnknown dell'aggregatore se il componente è aggregato.
Passaggio 2: Registrare l'estensione
Ora è necessario decidere quale classe di directory estendere. Non è possibile usare le stesse interfacce per eseguire questa operazione da usare per un'interfaccia ADSI, ad esempio IADsUser, IADsComputer. Gli oggetti directory vengono salvati in modo permanente nella directory, mentre l'estensione e ADSI sono in esecuzione nel computer client. Gli esempi di oggetti directory sono utente, computer, printQueue, service Connessione ionPoint e nTDSService. È possibile aggiungere una nuova classe in Active Directory e creare anche una nuova estensione per questa nuova classe.
Usare le chiavi del Registro di sistema per associare un nome di classe di directory ai componenti dell'estensione ADSI. La figura seguente rappresenta il layout del Registro di sistema esistente, nonché le nuove chiavi.
- Una nuova chiave, denominata Estensioni, contiene un elenco di chiavi, ognuna delle quali rappresenta una classe nella directory. Ogni classe, ad esempio utente, printQueue o computer, mantiene un elenco di sottochiavi.
- Ogni sottochiave contiene il CLSID del componente di estensione ADSI.
- Ogni sottochiave CLSID contiene una voce stringa che consente più valori. È consigliabile elencare solo le interfacce che partecipano all'aggregazione.
Nota
Gli oggetti di estensione sono comunque necessari per registrare le chiavi COM standard.
HKEY_LOCAL_MACHINE
Software
Microsoft
ADS
Providers
LDAP
Extensions
ClassNameA
CLSID of ExtensionA1
Interfaces = List of interfaces
CLSID of ExtensionA2
Interfaces = List of interfaces
ClassNameB
CLSID of ExtensionB1
Interfaces = List of interfaces
CLSID of ExtensionB2
Interfaces = List of interfaces
Esempio
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
ADs
Providers
LDAP
Extensions
printQueue
{9f37f39c-6f49-11d1-8c18-00c04fd8d503}
Interfaces = {466841B0-E531-11d1-8718-00C04FD44407}
{466841B1-E531-11d1-8718-00C04FD44407}
L'elenco di interfacce di Extension1 può essere diverso da quello di Extension2. L'oggetto, quando attivo, supporta le interfacce dell'aggregatore (ADSI) e tutte le interfacce fornite dall'aggregazione Extension1 e Extension2. La risoluzione delle interfacce in conflitto (la stessa interfaccia supportata sia dall'aggregatore che dalle aggregazioni o da più aggregazioni) è determinata dalle priorità delle estensioni.
È anche possibile associare l'estensione CLSID a più nomi di classe oggetto. Ad esempio, l'estensione può estendere gli oggetti utente e contatto .
Nota
Il comportamento dell'estensione viene aggiunto in una classe per oggetto, non in un'istanza per oggetto.
Come procedura consigliata, registrare le estensioni, come si farebbe con qualsiasi altro componente COM, con una chiamata alla funzione DllRegisterSvr . Fornire anche una funzionalità per annullare la registrazione dell'estensione con la funzione DllUnregisterServer .
Nell'esempio di codice seguente viene illustrato come registrare un'estensione.
/////
// Register the class.
///////////////////////
hr = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\Microsoft\\ADs\\Providers\\LDAP\\Extensions\\User\\{E1E3EDF8-48D1-11D2-B22B-0000F87A6B50}"),
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&hKey,
&dwDisposition );
///////////////////////////
// Register the Interface.
///////////////////////////
const TCHAR szIf[] = _T("{E1E3EDF7-48D1-11D2-B22B-0000F87A6B50}");
hr = RegSetValueEx( hKey, _T("Interfaces"), 0, REG_BINARY, (const BYTE *) szIf, sizeof(szIf) );
RegCloseKey(hKey);
return S_OK;
}