Поделиться через


Привязка с 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();
}

См. также

примеры ADS_AUTHENTICATION_ENUM

IADsOpenDSObject

ADsOpenObject