Share via


Enlace con ADsOpenObject e IADsOpenDSObject::OpenDSObject

La función ADsOpenObject y el método IADsOpenDSObject::OpenDSObject se usan para enlazar a objetos de servicio de directorio cuando se deben especificar credenciales alternativas y cuándo se requiere cifrado de datos.

Las credenciales del subproceso que realiza la llamada deben usarse siempre que sea posible. Sin embargo, si se deben usar credenciales alternativas, se debe usar la función ADsOpenObject o el método IADsOpenDSObject::OpenDSObject . Si se usan credenciales alternativas, es importante no almacenar en caché la contraseña. Se pueden realizar varias operaciones de enlace especificando el nombre de usuario y la contraseña para la primera operación de enlace y, a continuación, especificando solo el nombre de usuario en los enlaces posteriores. El sistema configura una sesión en la primera llamada y usa la misma sesión en las llamadas de enlace posteriores, siempre que se cumplan las condiciones siguientes:

  • El mismo nombre de usuario en cada operación de enlace.
  • Implemente el enlace sin servidor o enlace al mismo servidor en cada operación de enlace.
  • Mantenga una sesión abierta manteniendo presionada una referencia de objeto desde una de las operaciones de enlace. La sesión se cierra cuando se libera la última referencia de objeto.

ADsOpenObject e IADsOpenDSObject::OpenDSObject usan las interfaces del proveedor de compatibilidad de seguridad (SSPI) de Windows NT para permitir flexibilidad en las opciones de autenticación. La principal ventaja de usar estas interfaces es proporcionar diferentes tipos de autenticación a los clientes de Active Directory y cifrar la sesión. Actualmente, ADSI no permite pasar certificados. Por lo tanto, puede usar SSL para el cifrado y, a continuación, Kerberos, NTLM o autenticación simple, en función de cómo se establezcan las marcas en el parámetro dwReserved .

No puede solicitar un proveedor SSPI específico en ADSI, aunque siempre obtiene el protocolo de preferencia más alto. En el caso de un enlace de cliente de Windows a un equipo que ejecuta Windows, el protocolo es Kerberos. No permitir un certificado para la autenticación es aceptable en el caso de una página web porque la autenticación se produce antes de ejecutar la página web.

Aunque las operaciones Open permiten especificar un usuario y una contraseña, no debe hacerlo. En su lugar, no especifique ninguna credencial y use implícitamente las credenciales del contexto de seguridad del autor de la llamada. Para enlazar a un objeto de directorio mediante las credenciales del autor de la llamada con ADsOpenObject o IADsOpenDSObject::OpenDSObject, especifique NULL tanto para el nombre de usuario como para la contraseña.

Por último, para enlazar sin autenticación, use la marca ADS_NO_AUTHENTICATION . Ninguna autenticación indica que ADSI intenta enlazar como un usuario anónimo al objeto de destino y no realiza ninguna autenticación. Esto equivale a solicitar un enlace anónimo en LDAP e indica que todos los usuarios se incluyen en el contexto de seguridad.

Si las marcas de autenticación se establecen en cero, ADSI realiza un enlace simple, enviado como texto no cifrado.

Precaución

Si se especifica un nombre de usuario y una contraseña sin especificar marcas de autenticación, el nombre de usuario y la contraseña se transmiten a través de la red en texto no cifrado, lo que supone un riesgo de seguridad. No especifique un nombre de usuario y una contraseña sin especificar marcas de autenticación.

Ejemplos

En el siguiente ejemplo de código de Visual Basic se muestra cómo usar el 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)

En el siguiente ejemplo de código de C++ se muestra cómo usar la función 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()
}

La interfaz IADsOpenDSObject también se puede usar en C++, pero duplica la función ADsOpenObject .

En el siguiente ejemplo de código de C++ se muestra cómo usar la interfaz IADsOpenDSObject para realizar la misma operación de enlace que en el ejemplo de código anterior.

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();
}

Consulte también

ejemplos de ADS_AUTHENTICATION_ENUM

IADsOpenDSObject

ADsOpenObject