共用方式為


早期系結支援

下列程式代碼範例提供已就地提供早期系結支援的案例。

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

在此程式代碼範例中,兩個 擴充元件會擴充用戶 物件。 每個延伸模組都會發佈自己的介面。 每個延伸模組都無法辨識其他擴充介面;只有ADSI可辨識這兩個延伸模組的存在。 每個擴充功能都會將其 IUnknown 委派給 ADSI。 ADSI 會作為延伸模組和其他任何其他延伸模組的匯總工具。 從任何延伸模組或 ADSI 查詢介面會產生相同的一致結果。

下列程序說明如何建立延伸模組。

步驟 1:將匯總新增至您的元件

請遵循 COM 規格,將匯總新增至您的元件。 總而言之,您必須在 CreateInstance 期間接受對元件的 pUnknown 要求,並在匯總元件時將 pUnknown 委派給匯總工具的 IUnknown

步驟 2:註冊擴充功能

現在您必須決定要擴充的目錄類別。 您無法使用相同的介面來完成這個作業,例如 IADsUser、IADsComputer。 目錄物件會保存在目錄中,而您的擴充功能和 ADSI 是在用戶端電腦上執行。 目錄物件範例包括使用者計算機printQueueservice 連線 ionPointnTDSService。 您也可以在 Active Directory 中新增類別,並為這個新類別建立新的擴充功能。

您可以使用登錄機碼將目錄類別名稱與 ADSI 延伸模組元件產生關聯。 下圖代表現有的登錄配置,以及新的機碼。

  • 名為 Extensions 的新索引鍵包含索引鍵清單,每個索引鍵都代表目錄中的類別。 例如, 使用者printQueue計算機,每個類別都會維護子機碼的清單。
  • 每個子機碼都包含ADSI擴充元件的CLSID。
  • 每個 CLSID 子機碼都包含允許多個值的字串專案。 您應該只列出參與匯總的介面。

注意

註冊標準 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 延伸模組與多個物件類別名稱產生關聯。 例如,您的延伸模組可以同時擴充 用戶聯繫人 物件。

注意

擴充行為會新增至每個物件類別,而不是在每個物件實例上。

 

最佳做法是,使用 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;
 
}