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


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

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

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

Синтаксис

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 приведет к сбою проверки подлинности.

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

Если проверка подлинности 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 предоставляют те же функции, что и метод 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 для открытия объекта пользователя "Администратор" в 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

ADS_AUTHENTICATION_ENUM

ADsOpenObject

привязки

GetObject

IADsOpenDSObject

IDispatch

LDAP ADsPath

WNetAddConnetion2