Condividi tramite


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;
 
}