Problemas de autenticación de usuario con el proveedor WinNT de interfaces de servicio de Active Directory
En este artículo se describen los problemas de autenticación de usuario con el proveedor WinNT de interfaces de servicio de Active Directory (ADSI).
Se aplica a todas las ediciones de Windows 10
Número de KB original: 218497
Resumen
El método OpenDsObject adsI o la función auxiliar ADsOpenDsObject C le permite proporcionar credenciales de autenticación al servidor de directorios al abrir un objeto. Hay una serie de problemas que debe tener en cuenta al usar esta técnica con el proveedor WinNT de interfaces de servicio de Active Directory.
Más información
El proveedor winNT de interfaces de servicio de Active Directory usa la función WNetAddConnection2 para establecer una conexión con \\servername\IPC$ para establecer estas credenciales con el servidor remoto. Este método es útil porque no requiere privilegios especiales para los clientes NT y funciona en Windows y admite la autenticación en dominios que no son de confianza.
Desafortunadamente, hay varias desventajas inherentes a la función WNetAddConnection2 y son las siguientes:
Si ya se ha establecido alguna conexión en el servidor de destino mediante cualquier proceso que se ejecute en el equipo cliente, la función WNetAddConnection2 no puede realizar una nueva conexión con ninguna credencial distinta de las usadas para la conexión existente.
Si intenta autenticar una nueva cuenta, obtendrá un error de credenciales en conflicto. Si intenta autenticar la cuenta existente, cualquier contraseña funcionará (válida o no). Se trata de un problema concreto cuando se obtienen objetos de un controlador de dominio donde muchos procesos del sistema establecen conexiones a controladores de dominio.
Si la cuenta de invitado está habilitada en el equipo de destino, es posible pasar un nombre de usuario y una contraseña no válidos y crear una conexión.
El sistema no hace referencia a las conexiones de recuento, por lo que, si hay algún proceso, incluido el proceso de cliente de interfaces de servicio de Active Directory, elimina la conexión y, a continuación, todos los procesos que usan esa conexión deben escribirse para volver a establecerla cuando encuentren que se ha eliminado.
Al usar el proveedor WinNT, se recomienda autenticarse con el servidor de destino iniciando sesión en una cuenta de dominio con las credenciales adecuadas o usando la función LogonUser (que requiere privilegios elevados) antes de ejecutar el código de las interfaces de servicio de Active Directory. También se recomienda no usar el método OpenDsObject de interfaces de servicio de Active Directory para validar las credenciales de un usuario en cualquier dominio que sea de confianza para el equipo cliente.
Si intenta validar cuentas de dominios que no son de confianza, use el método OpenDsObject de interfaces de servicio de Active Directory, teniendo en cuenta los problemas enumerados anteriormente y teniendo en cuenta que va a enviar contraseñas sin cifrar a través de la red. Puede superar estas restricciones ejecutando código de validación como servicio en al menos un servidor de cada conjunto de dominios que no son de confianza mediante una conexión SSL (o HTTPS) para proporcionar cifrado. Para ello, use un archivo .asp de validación en un servidor IIS en cada conjunto de dominios que no son de confianza y conéctese a él a través de HTTPS mediante la autenticación básica.
El método OpenDsObject de interfaces de servicio de Active Directory usa las credenciales del usuario que ha iniciado sesión para acceder a IIS. El nombre de usuario y la contraseña que se proporcionan como parámetros se omiten. Aparece el siguiente mensaje de error:
Acceso denegado
Sin embargo, funciona después de agregar el usuario que inició sesión del cliente al grupo Administradores del servidor.
También funciona si usa el siguiente código de script.
Set objLogon = CreateObject("LoginAdmin.ImpersonateUser")
objLogon.Logon "Administrator", "AdminPassword", "Machinename"
Set oNS = GetObject("IIS:")
Set oRoot = oNS.OpenDSObject("IIS://SERVER/SHARE", "Mordor\administrator", "Gollum", 1)'User credentials are ignored
objLogon.Logoff
Set objLogon = Nothing