IADsOpenDSObject::OpenDSObject 方法使用给定凭据绑定到 ADSI 对象,并检索指向指定对象的 IDispatch 指针。
语法
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 基础结构来执行缓存。 若要使用缓存的凭据,lpszPassword 和 lpszUserName 在 OpenDSObject的任何后续调用中必须保持不变。 下面的代码示例演示了此操作。
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 方法使用默认凭据,lpszUserName,lpszPassword 设置为 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 |