Метод IADsOpenDSObject::OpenDSObject (iads.h)
Метод IADsOpenDSObject::OpenDSObject привязывается к объекту ADSI с помощью заданных учетных данных и получает указатель IDispatch на указанный объект.
Синтаксис
HRESULT OpenDSObject(
[in] BSTR lpszDNName,
[in] BSTR lpszUserName,
[in] BSTR lpszPassword,
[in] long lnReserved,
[out] IDispatch **ppOleDsObj
);
Параметры
[in] lpszDNName
Строка Юникода, завершающая значение NULL, указывающая ADsPath объекта ADSI. Дополнительные сведения и примеры строк привязки для этого параметра см. в разделе LDAP ADsPath. При использовании поставщика LDAP с ADsPath, который содержит определенное имя сервера, параметр lnReserved должен включать флаг ADS_SERVER_BIND.
[in] lpszUserName
Строка Юникода, завершающая значение NULL, указывающая имя пользователя, используемое для защиты разрешений с сервера пространства имен. Дополнительные сведения см. в следующем разделе "Примечания".
[in] lpszPassword
Строка Юникода, завершающая значение NULL, указывающая пароль, используемый для получения разрешения от сервера пространства имен.
[in] lnReserved
Флаги проверки подлинности, используемые для определения параметров привязки. Дополнительные сведения см. в ADS_AUTHENTICATION_ENUM.
[out] ppOleDsObj
Указатель на указатель на интерфейс IDispatch в запрошенном объекте.
Возвращаемое значение
Этот метод поддерживает стандартные возвращаемые значения, включая S_OK при успешном получении интерфейса IDispat ch с помощью этих учетных данных.
Дополнительные сведения см. в разделе Коды ошибок 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. Чтобы попытаться выполнить бессерверную привязку с компьютера, необходимо привязать пользователя домена.
Чтобы кэширование учетных данных работало должным образом, важно сохранить ссылку на объект незавершенным для поддержания дескриптора кэша. В приведенном выше примере попытка открыть obj2 после выпуска obj1 приведет к сбою проверки подлинности.
Метод
Если проверка подлинности Kerberos требуется для успешного завершения определенного запроса каталога с помощью поставщика LDAP, строка привязки lpszDNName должна использовать бессерверный ADsPath, например LDAP://CN=Jeff Smith, CN=admin, DC=Fabrikam, DC=DC=com, или использовать ADPath с полным dns-именем, например "LDAP://central3.corp.Fabrikam.com/CN=Jeff Смит, CN=admin,DC=Fabrikam,DC=com". Привязка к серверу с помощью неструктурированного имени NETBIOS или короткого DNS-имени, например с использованием короткого имени "central3" вместо "central3.corp.Fabrikam.com", может или не может привести к проверке подлинности Kerberos.
Вспомогательные функции ADsOpenObject
С помощью поставщика LDAP для Active Directory можно передать lpszUserName как одну из следующих строк:
- Имя учетной записи пользователя, например jeffsmith. Чтобы использовать имя пользователя самостоятельно, необходимо задать только флаг ADS_SECURE_AUTHENTICATION в параметре lnReserved.
- Путь пользователя из предыдущей версии Windows, например Fabrikam\jeffsmith.
- Различающееся имя, например "CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com". Чтобы использовать DN, параметр lnReserved должен быть равен нулю или должен содержать флаг ADS_USE_SSL
- Имя субъекта-пользователя (UPN), например "jeffsmith@Fabrikam.com". Чтобы использовать имя участника-пользователя, необходимо назначить соответствующее значение имени участника-пользователя для атрибута userPrincipalName целевого объекта пользователя.
Примеры
В следующем примере кода показано, как использовать IADsOpenDSObject для открытия объекта пользователя "Администратор" в Fabrikam с безопасной проверкой подлинности через поставщик 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 для открытия объекта Active Directory через поставщика LDAP.
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