Método IADsOpenDSObject::OpenDSObject (iads.h)
O método
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
Valor de retorno
Esse método dá suporte aos valores de retorno padrão, incluindo
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
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
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 |