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

以 null 结尾的 Unicode 字符串,指定 ADSI 对象的 ADsPath。 有关此参数绑定字符串的详细信息和示例,请参阅 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 基础结构来执行缓存。 若要使用缓存的凭据,在 OpenDSObject 的任何后续调用中,lpszPasswordlpszUserName 必须保持不变。 下面的代码示例演示了此操作。

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”将导致身份验证失败。

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

如果使用 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 身份验证,也可能不会产生 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”用户对象。

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
目标平台 Windows
标头 iads.h
DLL Activeds.dll

另请参阅

ADSI 错误代码

ADS_AUTHENTICATION_ENUM

ADsOpenObject

Binding

GetObject

IADsOpenDSObject

IDispatch

LDAP ADsPath

WNetAddConnetion2