Привязка с ADsOpenObject и IADsOpenDSObject::OpenDSObject
Функция ADsOpenObject и метод IADsOpenDSObject::OpenDSObject используются для привязки к объектам службы каталогов, когда необходимо указать альтернативные учетные данные и когда требуется шифрование данных.
Учетные данные вызывающего потока следует использовать, когда это возможно. Однако если необходимо использовать альтернативные учетные данные, необходимо использовать функцию ADsOpenObject или метод IADsOpenDSObject::OpenDSObject . Если используются альтернативные учетные данные, важно не кэшировать пароль. Несколько операций привязки можно выполнить, указав имя пользователя и пароль для первой операции привязки, а затем указав только имя пользователя в последующих привязках. Система настраивает сеанс при первом вызове и использует тот же сеанс для последующих вызовов привязки, если выполняются следующие условия:
- Одно и то же имя пользователя в каждой операции привязки.
- Реализуйте бессерверную привязку или привязку к одному серверу в каждой операции привязки.
- Сохраняйте открытый сеанс, удерживая ссылку на объект из одной из операций привязки. Сеанс закрывается при выпуске последней ссылки на объект.
ADsOpenObject и IADsOpenDSObject::OpenDSObject используют интерфейсы поставщиков поддержки безопасности Windows NT (SSPI), чтобы обеспечить гибкость в вариантах проверки подлинности. Основным преимуществом использования этих интерфейсов является предоставление различных типов проверки подлинности клиентам Active Directory и шифрование сеанса. В настоящее время ADSI не позволяет передавать сертификаты. Поэтому вы можете использовать SSL для шифрования, а затем Kerberos, NTLM или простую проверку подлинности в зависимости от того, как флаги заданы в параметре dwReserved .
Вы не можете запросить конкретный поставщик SSPI в ADSI, хотя вы всегда получаете самый высокий протокол предпочтения. В случае привязки клиента Windows к компьютеру под управлением Windows протокол Kerberos. Не разрешать сертификат для проверки подлинности допустимо в случае веб-страницы, так как проверка подлинности происходит до запуска веб-страницы.
Хотя открытые операции позволяют указать пользователя и пароль, это не следует делать. Вместо этого не указывайте учетные данные и неявно используйте учетные данные контекста безопасности вызывающего объекта. Чтобы привязаться к объекту каталога с помощью учетных данных вызывающего объекта с ADsOpenObject или IADsOpenDSObject::OpenDSObject, укажите NULL
как имя пользователя, так и пароль.
Наконец, чтобы привязать без проверки подлинности, используйте флаг ADS_NO_AUTHENTICATION . Проверка подлинности не указывает, что ADSI пытается привязать анонимного пользователя к целевому объекту и не выполняет проверку подлинности. Это эквивалентно запросу анонимной привязки в LDAP и указывает, что все пользователи включены в контекст безопасности.
Если флаги проверки подлинности равны нулю, ADSI выполняет простую привязку, отправленную в виде обычного текста.
Внимание
Если имя пользователя и пароль указаны без указания флагов проверки подлинности, имя пользователя и пароль передаются по сети в виде обычного текста, что является угрозой безопасности. Не указывайте имя пользователя и пароль, не указывая флаги проверки подлинности.
Примеры
В следующем примере кода Visual Basic показано, как использовать метод IADsOpenDSObject::OpenDSObject .
Const ADS_SECURE_AUTHENTICATION = 1
Dim openDS As IADsOpenDSObject
Dim usr As IADsUser
Set openDS = GetObject("LDAP:")
openDS.OpenDSObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
vbNullString,
vbNullString,
ADS_SECURE_AUTHENTICATION)
В следующем примере кода C++ показано, как использовать функцию ADsOpenObject .
IADs *pObject;
HRESULT hr;
hr = ADsOpenObject(L"LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)&pObject);
if(SUCCEEDED(hr))
{
// Use the object.
// Release the object.
pObject->Release()
}
Интерфейс IADsOpenDSObject также можно использовать в C++, но он дублирует функцию ADsOpenObject.
В следующем примере кода C++ показано, как использовать интерфейс IADsOpenDSObject для выполнения той же операции привязки, что и в приведенном выше примере кода.
IADsOpenDSObject *pDSO;
HRESULT hr;
hr = ADsGetObject(L"LDAP:", IID_IADsOpenDSObject, (void**)&pDSO);
if(SUCCEEDED(hr))
{
IDispatch *pDisp;
hr = pDSO->OpenDSObject(CComBSTR("LDAP://CN=jeffsmith,DC=fabrikam,DC=com"),
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
&pDisp);
if(SUCCEEDED(hr))
{
IADs *pObject;
hr = pDisp->QueryInterface(IID_IADs, (void**) &pObject);
if(SUCCEEDED(hr))
{
// Use the object.
// Release the object.
pObject->Release();
}
pDisp->Release();
}
pDSO->Release();
}