IADsOpenDSObject::OpenDSObject 方法 (iads.h)

IADsOpenDSObject::OpenDSObject 方法使用给定凭据绑定到 ADSI 对象,并检索指向指定对象的 IDispatch 指针。

重要 不建议将此方法用于 WinNT 提供程序。 有关详细信息,请参阅知识库文章218497,Active Directory 服务接口 WinNT 提供程序的用户身份验证问题。
 

语法

HRESULT OpenDSObject(
  [in]  BSTR      lpszDNName,
  [in]  BSTR      lpszUserName,
  [in]  BSTR      lpszPassword,
  [in]  long      lnReserved,
  [out] IDispatch **ppOleDsObj
);

参数

[in] lpszDNName

指定 ADSI 对象的 ADsPath 的以 null 结尾的 Unicode 字符串。 有关此参数绑定字符串的详细信息和示例,请参阅 LDAP ADsPath。 将 LDAP 提供程序用于包含特定服务器名称的 ADsPath 时,lnReserved 参数应包含 ADS_SERVER_BIND 标志。

[in] lpszUserName

以 null 结尾的 Unicode 字符串,指定要用于保护命名空间服务器的权限的用户名。 有关详细信息,请参阅以下“备注”部分。

[in] lpszPassword

以 null 结尾的 Unicode 字符串,指定要用于从命名空间服务器获取权限的密码。

[in] lnReserved

用于定义绑定选项的身份验证标志。 有关详细信息,请参阅 ADS_AUTHENTICATION_ENUM

[out] ppOleDsObj

指向所请求对象的 IDispatch 接口的指针。

返回值

此方法支持标准返回值,包括使用这些凭据成功检索 IDispatch 接口时 S_OK

有关详细信息,请参阅 ADSI 错误代码

言论

不应只使用此方法来验证用户凭据。

设置 lnReserved 时,OpenDSObject 的行为取决于它连接到的提供程序。 高安全性命名空间可能会忽略这些标志,并且始终需要身份验证。

IADsOpenDSObject::OpenDSObject 方法维护缓存中经过身份验证和加密的用户凭据。 缓存凭据可用于后续操作,以绑定到任何其他目录对象。 ADSI 客户端应用程序不应缓存用户提供的凭据。 相反,它们应依赖于 ADSI 基础结构来执行缓存。 若要使用缓存的凭据,lpszPasswordlpszUserNameOpenDSObject的任何后续调用中必须保持不变。 下面的代码示例演示了此操作。

Dim dso As IADsOpenDSObject
Dim obj1, obj2 As IADs
Dim szUsername As String
Dim szPassword As String

Set dso = GetObject("LDAP:")

' Insert code securely.

' Supply full credentials to initiate a server connection.
Set obj1 = dso.OpenDSObject( _
    "LDAP://server1/CN=Dept1,DC=Fabrikam,DC=com", _
    szUsername, _
    szPassword, _
    ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

' Perform an operation with the bound object, obj1
MsgBox obj1.Class

' Bind to another object with the cached user credential.
Set obj2 = dso.OpenDSObject( _
    "LDAP://server1/CN=Dept2,DC=Fabrikam,DC=com", _
    szUsername, _
    szPassword, _
    ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

MsgBox obj2.Class

传递给 IADsOpenDSObject::OpenDSObject 函数的凭据仅用于绑定到的特定对象,并且不会影响调用线程的安全上下文。 这意味着,在以下代码示例中,调用 IADsOpenDSObject::OpenDSObject 将使用与 调用 getObject不同的凭据。

Dim dso As IADsOpenDSObject
Dim obj1, obj2 As IADs
Dim szUsername As String
Dim szPassword As String

Set dso = GetObject("LDAP:")

' Insert code securely.

' Bind using full credentials.
Set obj1 = dso.OpenDSObject( _
    "LDAP://server1/CN=Dept1,DC=Fabrikam,DC=com", _
    szUsername, _
    szPassword, _
    ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

' Bind to another object with the default credentials.
Set obj2 = GetObject("LDAP://server1/CN=Dept2,DC=Fabrikam,DC=com")

使用无服务器绑定时,不会显式声明服务器名称“server1”。 请改用默认服务器。 只有 LDAP 提供程序支持无服务器绑定。 若要使用此功能,客户端计算机必须位于 Active Directory 域中。 若要尝试从计算机进行无服务器绑定,必须作为域用户进行绑定。

若要使凭据缓存正常工作,请务必保留未完成的对象引用来维护缓存句柄。 在上述示例中,在释放“obj1”后尝试打开“obj2”将导致身份验证失败。

IADsOpenDSObject 方法使用默认凭据,lpszUserNamelpszPassword 设置为 NULL

如果使用 LDAP 提供程序成功完成特定目录请求需要 Kerberos 身份验证,lpszDNName 绑定字符串必须使用无服务器 ADsPath,例如“LDAP://CN=Jeff Smith,CN=admin,DC=Fabrikam,DC=com”,或者必须使用具有完全限定 DNS 服务器名称的 ADsPath,例如“LDAP://central3.corp.Fabrikam.com/CN=Jeff Smith”CN=admin,DC=Fabrikam,DC=com”。 例如,使用平面 NETBIOS 名称或短 DNS 名称(例如,使用短名称“central3”而不是“central3.corp.Fabrikam.com”)绑定到服务器,可能会或可能不会生成 Kerberos 身份验证。

ADsOpenObject 帮助程序函数提供的功能与 IADsOpenDSObject::OpenDSObject 方法相同。

使用 Active Directory 的 LDAP 提供程序,可以将 lpszUserName 作为以下字符串之一传入:

  • 用户帐户的名称,例如“jeffsmith”。 若要单独使用用户名,必须仅在 lnReserved 参数中设置 ADS_SECURE_AUTHENTICATION 标志。
  • 以前版本的 Windows 中的用户路径,例如“Fabrikam\jeffsmith”。
  • 可分辨名称,例如“CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=com”。 若要使用 DN,lnReserved 参数必须为零,或者必须包含 ADS_USE_SSL 标志
  • 用户主体名称(UPN),例如“jeffsmith@Fabrikam.com”。 若要使用 UPN,必须为目标用户对象的 userPrincipalName 属性分配相应的 UPN 值。

例子

下面的代码示例演示如何使用 IADsOpenDSObject 通过 LDAP 提供程序打开“Fabrikam”上的“Administrator”用户对象,并通过 LDAP 提供程序进行安全身份验证。

Dim dso As IADsOpenDSObject
Dim ___domain As IADsDomain
Dim szUsername As String
Dim szPassword As String

On Error GoTo Cleanup

' Insert code to securely retrieve the user name and password.
 
Set dso = GetObject("LDAP:")
Set ___domain = dso.OpenDSObject("LDAP://Fabrikam", szUsername, _
                              szPassword, _
                              ADS_SECURE_AUTHENTICATION)

Cleanup:
    If (Err.Number <> 0 ) Then
        MsgBox("An error has occurred. " & Err.Number)
    End If
    Set dso = Nothing
    Set ___domain = Nothing

以下代码示例使用 IADsOpenDSObject 通过 LDAP 提供程序打开 Active Directory 对象。

IADsOpenDSObject *pDSO = NULL;
HRESULT hr = S_OK;
 
hr = ADsGetObject(L"LDAP:", IID_IADsOpenDSObject, (void**) &pDSO);
if (SUCCEEDED(hr))
{
    IDispatch *pDisp;
    hr = pDSO->OpenDSObject(CComBSTR("LDAP://DC=Fabrikam, DC=com"), 
                       CComBSTR("jeffsmith@Fabrikam.com"),
                       CComBSTR("passwordhere"),
                       ADS_SECURE_AUTHENTICATION, 
                       &pDisp);
    pDSO->Release();
    if (SUCCEEDED(hr))
    {
        IADs *pADs;
        hr = pDisp->QueryInterface(IID_IADs, (void**) &pADs);
        pDisp->Release();
        if (SUCCEEDED(hr))
        {
        // Perform an object manipulation here.
            pADs->Release();
        }
    }
}

要求

要求 价值
最低支持的客户端 Windows Vista
支持的最低服务器 Windows Server 2008
目标平台 窗户
标头 iads.h
DLL Activeds.dll

另请参阅

ADSI 错误代码

ADS_AUTHENTICATION_ENUM

ADsOpenObject

绑定

GetObject

IADsOpenDSObject

IDispatch

LDAP ADsPath

WNetAddConnetion2