Метод IADsOpenDSObject::OpenDSObject (iads.h)

Метод IADsOpenDSObject::OpenDSObject привязывается к объекту ADSI, используя указанные учетные данные, и извлекает указатель IDispatch на указанный объект.

Важно Не рекомендуется использовать этот метод с поставщиком WinNT. Дополнительные сведения см. в статье базы знаний 218497 проблемы с проверкой подлинности пользователей с помощью поставщика WinNT интерфейсов служб Active Directory.
 

Синтаксис

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

Строка Юникода, завершающаяся нулевым значением, которая указывает имя пользователя, которое будет использоваться для защиты разрешений от сервера пространства имен. Дополнительные сведения см. в разделе "Примечания".

[in] lpszPassword

Строка Юникода, завершающаяся null, которая указывает пароль, используемый для получения разрешения от сервера пространства имен.

[in] lnReserved

Флаги проверки подлинности, используемые для определения параметров привязки. Дополнительные сведения см. в разделе ADS_AUTHENTICATION_ENUM.

[out] ppOleDsObj

Указатель на указатель на интерфейс IDispatch для запрошенного объекта.

Возвращаемое значение

Этот метод поддерживает стандартные возвращаемые значения, включая S_OK , когда интерфейс IDispatch успешно получен с помощью этих учетных данных.

Дополнительные сведения см. в разделе Коды ошибок 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 приведет к сбою проверки подлинности.

Метод IADsOpenDSObject использует учетные данные по умолчанию, если для lpszUserName и lpszPassword задано значение NULL.

Если для успешного выполнения определенного запроса каталога с помощью поставщика LDAP требуется проверка подлинности Kerberos, строка привязки lpszDNName должна использовать бессерверный ADsPath, например "LDAP://CN=Jeff Smith,CN=admin,DC=Fabrikam,DC=com", либо использовать ADsPath с полным именем DNS-сервера, например "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 .

С помощью поставщика 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 для открытия объекта пользователя Administrator в 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
Целевая платформа Windows
Header iads.h
DLL Activeds.dll

См. также раздел

Коды ошибок ADSI

ADS_AUTHENTICATION_ENUM

ADsOpenObject

Привязка

GetObject

IADsOpenDSObject

IDispatch

Путь к LDAP AD

WNetAddConnetion2