Share via


使用 ADsOpenObject 和 IADsOpenDSObject::OpenDSObject 系結

ADsOpenObject 函式和 IADsOpenDSObject::OpenDSObject 方法是用來系結至目錄服務物件時,必須指定替代認證,以及需要數據加密時。

應盡可能使用呼叫線程的認證。 不過,如果必須使用替代認證, 則必須使用 ADsOpenObject 函式或 IADsOpenDSObject::OpenDSObject 方法。 如果使用替代認證,請務必不要快取密碼。 您可以指定第一個系結作業的使用者名稱和密碼,然後只指定後續系結中的用戶名稱,以執行多個系結作業。 只要符合下列條件,系統就會在第一次呼叫上設定會話,並在後續的系結呼叫上使用相同的會話:

  • 每個系結作業中的相同用戶名稱。
  • 在每個系結作業中實作無伺服器系結或系結至相同的伺服器。
  • 藉由保留其中一個系結作業的物件參考,以維護開啟的會話。 釋放最後一個對象參考時,會話會關閉。

ADsOpenObjectIADsOpenDSObject::OpenDSObject 使用 Windows NT 安全性支援提供者介面 (SSPI) 來允許驗證選項的彈性。 使用這些介面的主要優點是為 Active Directory 用戶端提供不同類型的驗證,以及加密會話。 目前,ADSI 不允許傳入憑證。 因此,您可以使用 SSL 進行加密,然後根據 dwReserved 參數上的旗標設定方式,使用 Kerberos、NTLM 或簡單驗證。

您無法在 ADSI 中要求特定的 SSPI 提供者,不過您一律會取得最高的喜好設定通訊協定。 如果是將 Windows 用戶端系結至執行 Windows 的電腦,通訊協定會是 Kerberos。 不允許憑證進行驗證,因為在執行網頁之前發生驗證,因此網頁無法接受驗證。

雖然 Open 作業可讓您指定使用者和密碼,但不應該這麼做。 相反地,請勿指定任何認證,並隱含地使用呼叫端安全性內容的認證。 若要使用呼叫端的認證搭配 ADsOpenObject 或 IADsOpenDSObject::OpenDSObject 系結至目錄物件,NULL請同時指定使用者名稱和密碼。

最後,若要系結沒有驗證,請使用 ADS_NO_AUTHENTICATION 旗標。 沒有驗證表示 ADSI 嘗試以匿名使用者身分系結至目標物件,而且不會執行驗證。 這相當於在LDAP中要求匿名系結,並指出所有使用者都包含在安全性內容中。

如果驗證旗標設定為零,ADSI 會執行簡單的系結,以純文本傳送。

警告

如果未指定驗證旗標來指定使用者名稱和密碼,則會以純文本透過網路傳輸使用者名稱和密碼,這是安全性風險。 請勿在未指定驗證旗標的情況下指定使用者名稱和密碼。

範例

下列 Visual Basic 程式代碼範例示範如何使用 IADsOpenDSObject::OpenDSObject 方法。

Const ADS_SECURE_AUTHENTICATION = 1
Dim openDS As IADsOpenDSObject
Dim usr As IADsUser
 
Set openDS = GetObject("LDAP:")
 
openDS.OpenDSObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
    vbNullString, 
    vbNullString,
    ADS_SECURE_AUTHENTICATION)

下列 C++ 程式代碼範例示範如何使用 ADsOpenObject 函式。

IADs *pObject;
HRESULT hr;

hr = ADsOpenObject(L"LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
    NULL, 
    NULL,
    ADS_SECURE_AUTHENTICATION, 
    IID_IADs,
    (void**)&pObject);
if(SUCCEEDED(hr))
{
    // Use the object.

    // Release the object.
    pObject->Release()
}

IADsOpenDSObject 介面也可以在 C++ 中使用,但它會複製 ADsOpenObject 函式。

下列 C++ 程式代碼範例示範如何使用 IADsOpenDSObject 介面來執行與上述程式碼範例相同的系結作業。

IADsOpenDSObject *pDSO;
HRESULT hr;
 
hr = ADsGetObject(L"LDAP:", IID_IADsOpenDSObject, (void**)&pDSO);
if(SUCCEEDED(hr))
{
    IDispatch *pDisp;

    hr = pDSO->OpenDSObject(CComBSTR("LDAP://CN=jeffsmith,DC=fabrikam,DC=com"),
        NULL,
        NULL,
        ADS_SECURE_AUTHENTICATION, 
        &pDisp);
    if(SUCCEEDED(hr))
    {
        IADs *pObject;

        hr = pDisp->QueryInterface(IID_IADs, (void**) &pObject);
        if(SUCCEEDED(hr))
        {
            // Use the object.

            // Release the object.
            pObject->Release();
        }

        pDisp->Release();
    }
    
    pDSO->Release();
}

另請參閱

ADS_AUTHENTICATION_ENUM範例

IADsOpenDSObject

ADsOpenObject