Compartir a través de


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

El método IADsOpenDSObject::OpenDSObject enlaza a un objeto ADSI, utilizando las credenciales especificadas y recupera un puntero IDispatch al objeto especificado.

Importante No se recomienda usar este método con el proveedor WinNT. Para obtener más información, consulte el artículo de KB 218497, problemas de autenticación de usuario con el proveedor WinNT de interfaces de servicio de Active Directory.
 

Sintaxis

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

Parámetros

[in] lpszDNName

Cadena Unicode terminada en null que especifica ADsPath del objeto ADSI. Para obtener más información y ejemplos de cadenas de enlace para este parámetro, consulte LDAP ADsPath. Cuando se usa el proveedor LDAP con un ADsPath que incluye un nombre de servidor específico, el parámetro lnReserved debe incluir la marca ADS_SERVER_BIND.

[in] lpszUserName

Cadena Unicode terminada en null que especifica el nombre de usuario que se va a usar para proteger el permiso del servidor de espacio de nombres. Para obtener más información, vea la siguiente sección Comentarios.

[in] lpszPassword

Cadena Unicode terminada en null que especifica la contraseña que se va a usar para obtener el permiso del servidor de espacio de nombres.

[in] lnReserved

Marcas de autenticación usadas para definir las opciones de enlace. Para obtener más información, vea ADS_AUTHENTICATION_ENUM.

[out] ppOleDsObj

Puntero a un puntero a un interfaz de IDispatch en el objeto solicitado.

Valor devuelto

Este método admite los valores devueltos estándar, incluidos los S_OK cuando la interfaz IDispatch se ha recuperado correctamente mediante estas credenciales.

Para obtener más información, consulta códigos de error adsi.

Observaciones

Este método no se debe usar solo para validar las credenciales de usuario.

Cuando se establece lnReserved, el comportamiento de openDSObject depende del proveedor al que se conecta. Los espacios de nombres de alta seguridad pueden omitir estas marcas y siempre requieren autenticación.

El método IADsOpenDSObject::OpenDSObject mantiene las credenciales de usuario autenticadas y cifradas en la memoria caché. Las credenciales almacenadas en caché se pueden usar en operaciones posteriores para enlazar a cualquier otro objeto de directorio. Las aplicaciones cliente ADSI no deben almacenar en caché las credenciales proporcionadas por el usuario. En su lugar, deben confiar en la infraestructura adsi para realizar el almacenamiento en caché. Para usar las credenciales almacenadas en caché, lpszPassword y lpszUserName deben permanecer sin cambios en las llamadas posteriores de OpenDSObject. En el ejemplo de código siguiente se muestra esta operación.

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

Las credenciales pasadas a la función IADsOpenDSObject::OpenDSObject solo se usan con el objeto determinado enlazado a y no afectan al contexto de seguridad del subproceso que realiza la llamada. Esto significa que, en el ejemplo de código siguiente, la llamada a IADsOpenDSObject::OpenDSObject usará credenciales diferentes que la llamada a 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")

Con un enlace sin servidor, el nombre del servidor, "server1", no se indica explícitamente. En su lugar, se usa el servidor predeterminado. Solo el proveedor LDAP admite el enlace sin servidor. Para usar esta característica, el equipo cliente debe estar en un dominio de Active Directory. Para intentar un enlace sin servidor desde un equipo, debe enlazar como usuario de dominio.

Para que el almacenamiento en caché de credenciales funcione correctamente, es importante mantener pendiente una referencia de objeto para mantener el identificador de caché. En el ejemplo anterior, un intento de abrir "obj2" después de liberar "obj1" producirá un error de autenticación.

El método IADsOpenDSObject usa las credenciales predeterminadas cuando lpszUserName y lpszPassword se establecen en NULL.

Si se requiere la autenticación Kerberos para la finalización correcta de una solicitud de directorio específica mediante el proveedor LDAP, el lpszDNName cadena de enlace debe usar un ADsPath sin servidor, como "LDAP://CN=Jeff Smith,CN=admin,DC=Fabrikam,DC=com", o debe usar un ADsPath con un nombre de servidor DNS completo, como "LDAP://central3.corp.Fabrikam.com/CN=Jeff Smith, CN=admin,DC=Fabrikam,DC=com". El enlace al servidor mediante un nombre NETBIOS plano o un nombre DNS corto, por ejemplo, con el nombre corto "central3" en lugar de "central3.corp.Fabrikam.com", puede producir o no autenticación Kerberos.

La función auxiliar ADsOpenObject ofrece las mismas características que el método IADsOpenDSObject::OpenDSObject.

Con el proveedor LDAP para Active Directory, puede pasar lpszUserName como una de las siguientes cadenas:

  • Nombre de una cuenta de usuario, como "jeffsmith". Para usar un nombre de usuario por sí mismo, solo debe establecer la marca ADS_SECURE_AUTHENTICATION en el parámetro lnReserved.
  • Ruta de acceso del usuario de una versión anterior de Windows, como "Fabrikam\jeffsmith".
  • Nombre distintivo, como "CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com". Para usar un DN, el parámetro lnReserved debe ser cero o debe incluir la marca ADS_USE_SSL
  • Nombre principal de usuario (UPN), como "jeffsmith@Fabrikam.com". Para usar un UPN, debe asignar el valor DE UPN adecuado para el atributo userPrincipalName de del objeto de usuario de destino.

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar IADsOpenDSObject para abrir el objeto de usuario "Administrador" en "Fabrikam" con autenticación segura a través del proveedor 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

En el ejemplo de código siguiente se usa IADsOpenDSObject para abrir un objeto de Active Directory a través del proveedor 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
cliente mínimo admitido Windows Vista
servidor mínimo admitido Windows Server 2008
de la plataforma de destino de Windows
encabezado de iads.h
DLL de Activeds.dll

Consulte también

códigos de error ADSI

ADS_AUTHENTICATION_ENUM

ADsOpenObject

de enlace

GetObject

IADsOpenDSObject

IDispatch

ldap ADsPath

WNetAddConnetion2