c# - ponen - generar documentacion visual studio 2017
¿Cómo interactuar mediante programación con winlogon? (5)
Tengo un servicio de Windows que quiero usar para desbloquear la estación de trabajo mediante programación, usando el nombre de usuario y la contraseña de la cuenta.
Este artículo https://technet.microsoft.com/en-us/library/dn751047(v=ws.11).aspx explica el flujo de trabajo de autenticación de inicio de sesión en Windows en la siguiente imagen:
Como se vio anteriormente, en el paso 5, el usuario ingresa las credenciales en la IU de inicio de sesión. Lo que quiero lograr es hacer que el Servicio de Windows ingrese las credenciales y que Winlogon realice el inicio de sesión.
No hay API de winlogon para lograr esto. Como se ha visto en otras preguntas, el uso de la función LogonUser
de winapi realiza con éxito la autenticación y devuelve un token, pero no cambia al escritorio de la aplicación y la IU de inicio de sesión permanece en la pantalla.
La mayoría de los artículos y las respuestas de SO apuntan a proveedores de credenciales, pero todos los ejemplos de proveedores de credenciales requieren la interacción del usuario con la IU de inicio de sesión.
Actualización: veo que algunos usuarios no han entendido exactamente la pregunta y están proponiendo soluciones alternativas que no son útiles para mi caso. El flujo de trabajo que estoy tratando de lograr es el siguiente:
- El servicio de Windows se inicia en el arranque de Windows (hecho).
- El mismo servicio de Windows tiene un servicio web y acepta solicitudes HTTP a través de una API (hecho).
- El usuario proporciona credenciales al servicio a través de la API desde otro dispositivo (listo).
- Las credenciales proporcionadas se utilizan para iniciar sesión en la estación de trabajo.
4.1 Las credenciales proporcionadas se utilizan para desbloquear también la estación de trabajo en caso de bloqueo (WinKey + L). - (Opcional) El servicio expone las cuentas de Windows a través de la API.
- (Opcional) El usuario puede especificar al servicio qué cuenta quiere usar para iniciar sesión.
Por ahora, estoy interesado en hacer los pasos 4 y 4.1.
Desviarse de manera gramatical / iniciar sesión en nombre de un usuario es aterrador con respecto a la ciberseguridad.
No estoy seguro de lo que está tratando de hacer, pero ¿por qué no implementar una tarea de ejecución para hacer el trabajo utilizando una cuenta de servicio en la máquina?
Puede configurarlo para que se ejecute incluso cuando el usuario no haya iniciado sesión en un momento / evento específico. Si eso no funciona para usted, ¿podría describir su escenario un poco más?
He escrito una solución comercial para esto, llamada SasLibEx. SasLibEx es una biblioteca, dirigida a desarrolladores, compatible con c / c ++ y delphi nativamente.
SasLibEx puede:
- Simular Ctrl Alt Del (Secuencia de atención segura)
- Cancelar Ctrl Alt Del
- Bloquear la estación de trabajo
- Desbloquear la estación de trabajo (sin credenciales)
- Deshabilitar Ctrl Alt Del
- Habilitar Ctrl Alt Del nuevamente
- Cancelar solicitud pendiente de UAC
- ¿Está bloqueado el escritorio?
Mientras pasa ... ¿Pero no está, entre las muestras de Microsoft, un proveedor de credenciales que toma una entrada asincrónica? Ciertamente he escrito uno que inicia sesión en un usuario que escanea una huella digital aceptable sin importar qué mosaico se muestra. Para mí, esto significa que la interacción con LogonUI no debe ser más que implícita, pero tal vez me falta algo.
Pero quizás yo no soy. Aunque no dudo que la intención es que la entrada asincrónica provenga de un usuario que actúa sobre hardware, como cuando se escanea un dedo, no lo recuerdo como una regla. Si no es así, entonces puede tener su opción programática en la forma de presentar las credenciales como si se hubieran recopilado de forma asíncrona, no desde un dispositivo que obviamente está conectado a la computadora sino desde su canal lateral de HTTP con quién sabe qué.
Entonces, ¿puede hacer que un proveedor de credenciales escuche a RPC desde su servicio para notificar las credenciales que su servicio ha recopilado a través de su canal lateral? O haga que su servicio escuche a RPC de su proveedor de credenciales para preguntar qué credenciales están disponibles todavía. Puede que no me sorprenda si se cierra una dirección, por seguridad, incluso, pero habría pensado que a una u otra se la puede hacer funcionar.
Si quieres hacer algo de esto, no quiero entrar.
No es que aprueba hacer esto, sino que simplemente te doy una solución al problema. Y no está interactuando de manera programática con el proceso WinLogon. Está trabajando programáticamente en torno a eso.
Use la propiedad de Windows Autologin. Y reinicie para cambiar a ese usuario. Tenga en cuenta que esto implica almacenar la contraseña en el registro, en texto claro.
Específicamente establece estos regkeys
HKLM / SOFTWARE / Microsoft / Windows NT / CurrentVersion / Winlogon / AutoAdminLogin HKLM / SOFTWARE / Microsoft / Windows NT / CurrentVersion / Winlogon / DefaultUserName HKLM / SOFTWARE / Microsoft / Windows NT / CurrentVersion / Winlogon / DefaultPassword
* Editar *
Ayuda con 4. No ayuda con 4.1. A menos que quieras reiniciar para desbloquear, lo cual dudo.
Otra alternativa que suena prometedora vale la pena investigar se menciona en una pregunta anterior https://.com/a/35173886/4640588
Tenía casi los mismos requisitos para un marco basado en selenio que estoy construyendo. Para resumir, necesitaba ejecutar una aplicación en la estación de Windows de un usuario (WinSTA0), lo que significaba que un usuario tenía que iniciar sesión en una máquina virtual.
Ya hice un proyecto con un administrador de credenciales y lo usé para lograr el siguiente flujo de trabajo:
- Inicie una VM, copie los componentes con Powershell
- Instale CredManager, reinicie VM
- Cred manager crea un usuario aleatorio, lo guarda en una base de datos
- Inicia sesión con ese usuario
- El usuario ha iniciado automáticamente una aplicación en el registro y la aplicación inicia un servidor web al que se puede contactar para girar las sesiones de selenio
Si entiendo sus requisitos correctamente, deberá crear un Administrador de credenciales que expone a un servidor (http, named-pipes, etc.) para que se comunique con las credenciales para iniciar sesión automáticamente, no necesita dedicar tiempo a la IU aquí. Utilice el método de Advice
bajo su implementación ITestWindowsCredentialProvider
para iniciar su servidor y el UnAdvice
para detenerlo.
Sugeriría lo siguiente para ayudarlo a llegar:
- Use un servicio de registro externo (como información sobre la aplicación) para obtener comentarios de su servicio y facilitar la depuración
- Usar una VM como una buena práctica, ya que una falla crítica en Winlogon hará que la computadora sea inútil.
- Utilice try catch en el nivel superior de todos sus métodos en la implementación de componentes COM para tragar la excepción y guardar los bloqueos de winlogon
Además, para una visión más amplia, deberá tener en cuenta que todos esos procesos tienen diferentes accesos (y duración para los componentes COM) a las estaciones de Windows, los escritorios y se ejecutan como usuarios diferentes. Sin embargo, no creo que esto sea relevante para ti.
Puede encontrar el código del administrador de credenciales base aquí: https://github.com/phaetto/windows-credentials-provider