Vinculação com ADsOpenObject e IADsOpenDSObject::OpenDSObject
A função ADsOpenObject e o método IADsOpenDSObject::OpenDSObject são usados para vincular a objetos de serviço de diretório quando credenciais alternativas devem ser especificadas e quando a criptografia de dados é necessária.
As credenciais do thread de chamada devem ser usadas quando possível. No entanto, se credenciais alternativas devem ser usadas, a função ADsOpenObject ou o método IADsOpenDSObject::OpenDSObject devem ser usados. Se credenciais alternativas forem usadas, é importante não armazenar em cache a senha. Várias operações de associação podem ser executadas especificando o nome de usuário e a senha para a primeira operação de associação e, em seguida, especificando apenas o nome de usuário nas ligações subsequentes. O sistema configura uma sessão na primeira chamada e usa a mesma sessão em chamadas de ligação subsequentes, desde que as seguintes condições sejam atendidas:
- O mesmo nome de usuário em cada operação de ligação.
- Implemente a vinculação sem servidor ou vincule ao mesmo servidor em cada operação de vinculação.
- Mantenha uma sessão aberta mantendo uma referência de objeto de uma das operações de ligação. A sessão é fechada quando a última referência de objeto é liberada.
ADsOpenObject e IADsOpenDSObject::OpenDSObject usam o Windows NT Security Support Provider Interfaces (SSPI) para permitir flexibilidade nas opções de autenticação. A principal vantagem de usar essas interfaces é fornecer diferentes tipos de autenticação para clientes do Active Directory e criptografar a sessão. Atualmente, o ADSI não permite que os certificados sejam passados. Portanto, você pode usar SSL para criptografia e, em seguida, Kerberos, NTLM ou autenticação simples, dependendo de como os sinalizadores são definidos no parâmetro dwReserved .
Não é possível solicitar um provedor SSPI específico no ADSI, embora você sempre obtenha o protocolo de preferência mais alto. No caso de uma associação de cliente Windows a um computador que executa o Windows, o protocolo é Kerberos. Não permitir um certificado para autenticação é aceitável no caso de uma página da Web porque a autenticação ocorre antes de executar a página da Web.
Embora as operações Open permitam especificar um usuário e uma senha, você não deve fazer isso. Em vez disso, não especifique nenhuma credencial e use implicitamente as credenciais do contexto de segurança do chamador. Para vincular a um objeto de diretório usando as credenciais do chamador com ADsOpenObject ou IADsOpenDSObject::OpenDSObject, especifique NULL
para nome de usuário e senha.
Finalmente, para vincular sem autenticação, use o sinalizador ADS_NO_AUTHENTICATION. Nenhuma autenticação indica que o ADSI tenta se vincular como um usuário anônimo ao objeto de destino e não executa nenhuma autenticação. Isso equivale a solicitar associação anônima no LDAP e indica que todos os usuários estão incluídos no contexto de segurança.
Se os sinalizadores de autenticação estiverem definidos como zero, o ADSI executará uma associação simples, enviada como texto sem formatação.
Cuidado
Se um nome de usuário e senha forem especificados sem especificar sinalizadores de autenticação, o nome de usuário e a senha serão transmitidos pela rede em texto sem formatação, o que representa um risco à segurança. Não especifique um nome de usuário e senha sem especificar sinalizadores de autenticação.
Exemplos
O exemplo de código do Visual Basic a seguir mostra como usar o método 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)
O exemplo de código C++ a seguir mostra como usar a função 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()
}
A interface IADsOpenDSObject também pode ser usada em C++, mas duplica a função ADsOpenObject .
O exemplo de código C++ a seguir mostra como usar a interface IADsOpenDSObject para executar a mesma operação de associação como no exemplo de código acima.
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();
}