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