Compartilhar via


Método IADsOpenDSObject::OpenDSObject (iads.h)

O método IADsOpenDSObject::OpenDSObject associa-se a um objeto ADSI, usando as credenciais fornecidas e recupera um ponteiro IDispatch para o objeto especificado.

Importante Não é recomendável que você use esse método com o Provedor WinNT. Para obter mais informações, consulte o artigo do KB 218497, problemas de autenticação do usuário com o provedor WinNT de Interfaces de Serviço do Active Directory.
 

Sintaxe

HRESULT OpenDSObject(
  [in]  BSTR      lpszDNName,
  [in]  BSTR      lpszUserName,
  [in]  BSTR      lpszPassword,
  [in]  long      lnReserved,
  [out] IDispatch **ppOleDsObj
);

Parâmetros

[in] lpszDNName

A cadeia de caracteres Unicode terminada em nulo que especifica o ADsPath do objeto ADSI. Para obter mais informações e exemplos de cadeias de caracteres de associação para esse parâmetro, consulte LDAP ADsPath. Ao usar o provedor LDAP com um ADsPath que inclui um nome de servidor específico, o parâmetro lnReserved deve incluir o sinalizador ADS_SERVER_BIND.

[in] lpszUserName

A cadeia de caracteres Unicode terminada em nulo que especifica o nome de usuário a ser usado para proteger a permissão do servidor de namespace. Para obter mais informações, consulte a seção Comentários a seguir.

[in] lpszPassword

A cadeia de caracteres Unicode terminada em nulo que especifica a senha a ser usada para obter permissão do servidor de namespace.

[in] lnReserved

Sinalizadores de autenticação usados para definir as opções de associação. Para obter mais informações, consulte ADS_AUTHENTICATION_ENUM.

[out] ppOleDsObj

Ponteiro para um ponteiro para uma interface de IDispatch no objeto solicitado.

Valor de retorno

Esse método dá suporte aos valores de retorno padrão, incluindo S_OK quando a interface de IDispatch foi recuperada com êxito usando essas credenciais.

Para obter mais informações, consulte códigos de erro ADSI.

Observações

Esse método não deve ser usado apenas para validar as credenciais do usuário.

Quando lnReserved é definido, o comportamento de OpenDSObject depende do provedor ao qual ele se conecta. Namespaces de alta segurança podem ignorar esses sinalizadores e sempre exigir autenticação.

O método IADsOpenDSObject::OpenDSObject mantém as credenciais de usuário autenticadas e criptografadas no cache. As credenciais armazenadas em cache podem ser usadas em operações subsequentes para associação a outros objetos de diretório. Os aplicativos cliente ADSI não devem armazenar em cache as credenciais fornecidas pelo usuário. Em vez disso, eles devem contar com a infraestrutura ADSI para executar o cache. Para usar as credenciais armazenadas em cache, lpszPassword e lpszUserName devem permanecer inalterados em todas as chamadas subsequentes de OpenDSObject. O exemplo de código a seguir mostra essa operação.

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

As credenciais passadas para a função IADsOpenDSObject::OpenDSObject são usadas apenas com o objeto específico associado e não afetam o contexto de segurança do thread de chamada. Isso significa que, no exemplo de código a seguir, a chamada para IADsOpenDSObject::OpenDSObject usará credenciais diferentes da chamada para 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")

Com uma associação sem servidor, o nome do servidor, "server1", não é declarado explicitamente. Em vez disso, o servidor padrão é usado. Somente o provedor LDAP dá suporte à associação sem servidor. Para usar esse recurso, o computador cliente deve estar em um domínio do Active Directory. Para tentar uma associação sem servidor de um computador, você deve se associar como um usuário de domínio.

Para que o cache de credenciais funcione corretamente, é importante manter uma referência de objeto pendente para manter o identificador de cache. No exemplo acima, uma tentativa de abrir "obj2" após a liberação de "obj1" resultará em uma falha de autenticação.

O método IADsOpenDSObject usa as credenciais padrão quando lpszUserName e lpszPassword são definidos como NULL.

Se a autenticação Kerberos for necessária para a conclusão bem-sucedida de uma solicitação de diretório específica usando o provedor LDAP, a cadeia de associação lpszDNName deve usar um ADsPath sem servidor, como "LDAP://CN=Jeff Smith,CN=admin,DC=Fabrikam,DC=com", ou deve usar um ADsPath com um nome de servidor DNS totalmente qualificado, como "LDAP://central3.corp.Fabrikam.com/CN=Jeff Smith, CN=admin,DC=Fabrikam,DC=com". Associar ao servidor usando um nome NETBIOS simples ou um nome DNS curto, por exemplo, usando o nome curto "central3" em vez de "central3.corp.Fabrikam.com", pode ou não gerar autenticação Kerberos.

A função auxiliar ADsOpenObject oferece os mesmos recursos que o método IADsOpenDSObject::OpenDSObject .

Com o provedor LDAP para Active Directory, você pode passar lpszUserName como uma das seguintes cadeias de caracteres:

  • O nome de uma conta de usuário, como "jeffsmith". Para usar um nome de usuário por si só, você deve definir apenas o sinalizador ADS_SECURE_AUTHENTICATION no parâmetro lnReserved.
  • O caminho do usuário de uma versão anterior do Windows, como "Fabrikam\jeffsmith".
  • Nome diferenciado, como "CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com". Para usar um DN, o parâmetro lnReserved deve ser zero ou deve incluir o sinalizador ADS_USE_SSL
  • Nome da Entidade de Usuário (UPN), como "jeffsmith@Fabrikam.com". Para usar um UPN, você deve atribuir o valor UPN apropriado para o atributo userPrincipalName do objeto de usuário de destino.

Exemplos

O exemplo de código a seguir mostra como usar IADsOpenDSObject para abrir o objeto de usuário "Administrador" em "Fabrikam" com Autenticação Segura por meio do provedor 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

O exemplo de código a seguir usa IADsOpenDSObject para abrir um objeto do Active Directory por meio do provedor 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();
        }
    }
}

Requisitos

Requisito Valor
de cliente com suporte mínimo Windows Vista
servidor com suporte mínimo Windows Server 2008
da Plataforma de Destino Windows
cabeçalho iads.h
de DLL Activeds.dll

Consulte também

códigos de erro ADSI

ADS_AUTHENTICATION_ENUM

ADsOpenObject

de associação

GetObject

IADsOpenDSObject

de IDispatch

LDAP ADsPath

WNetAddConnetion2