事前バインディングのサポート

次のコード例は、事前バインディングサポートを使用したシナリオを示しています。

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

このコード例では、2つの拡張コンポーネントがユーザーオブジェクトを拡張します。 各拡張機能は、独自のインターフェイスを発行します。 各拡張機能は、他の拡張インターフェイスを認識しません。ADSIのみが両方の拡張機能の存在を認識します。 各拡張機能は、そのIUnknownをADSIに委任します。 ADSIは、両方の拡張機能とその他の将来の拡張機能のアグリゲーターとして機能します。 任意の拡張機能またはADSIからインターフェイスを照会すると、同じ一貫した結果が得られます。

次の手順では、拡張機能を作成する方法について説明します。

コンポーネントに集計を追加します

コンポーネントに集計を追加するためのCOM仕様に従います。 要約すると、CreateInstance中にコンポーネントへのpUnknown要求を受け入れる必要があり、コンポーネントが集計されている場合は、アグリゲーターのIUnknownにpUnknownを委任します。

ステップ2: 拡張機能を登録します。

ここで、拡張するディレクトリクラスを決定する必要があります。 IADsUser、IADsComputerなど、ADSIインターフェイスに使用するのと同じインターフェイスを使用してこれを実現することはできません。 ディレクトリオブジェクトは、拡張機能とADSIがクライアントコンピューターで実行されている間、ディレクトリに保持されます。 ディレクトリオブジェクトの例としては、user、computer、printQueue、serviceConnectionPoint、nTDSServiceなどがあります。 Active Directoryに新しいクラスを追加し、この新しいクラスの新しい拡張機能を作成することもできます。

ディレクトリクラス名をADSI拡張機能コンポーネントに関連付けるには、レジストリキーを使用します。 次の図は、既存のレジストリレイアウトと新しいキーを示しています。

  • Extensionsという新しいキーには、ディレクトリ内のクラスを表すキーの一覧が含まれています。 ユーザー、printQueue、コンピューターなどの各クラスは、サブキーの一覧を保持します。
  • 各サブキーには、ADSI拡張コンポーネントのCLSIDが含まれています。
  • 各CLSIDサブキーには、複数の値を許可する文字列エントリが含まれています。 集計に参加するインターフェイスのみを一覧表示する必要があります。

Note

拡張オブジェクトは、標準のCOMキーを登録するために必要です。

 

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

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}

Extension1からのインターフェイスの一覧は、Extension2とは異なる場合があります。 アクティブな場合、オブジェクトは、アグリゲーター (ADSI) のインターフェイスと、集計のExtension1とExtension2によって提供されるすべてのインターフェイスをサポートします。 競合するインターフェイス (アグリゲーターと集計の両方または複数の集計でサポートされている同じインターフェイス) の解決は、拡張機能の優先順位によって決まります。

CLSID拡張機能を複数のオブジェクトクラス名に関連付けることもできます。 たとえば、拡張機能は、ユーザーオブジェクトと連絡先オブジェクトの両方を拡張できます。

Note

拡張機能の動作は、オブジェクトごとのインスタンスではなく、オブジェクトごとのクラスに追加されます。

 

ベストプラクティスとして、DllRegisterSvr関数の呼び出しを使用して、他のCOMコンポーネントと同様に拡張機能を登録します。 また、DllUnregisterServer関数を使用して拡張機能の登録を解除する機能も提供します。

次のコード例は、拡張機能を登録する方法を示しています。

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