recuperacion consola c# windows impersonation

consola - Suplantación de Windows desde C#



consola de recuperacion windows 10 (3)

¿Cómo puede un programa C # que se ejecuta como LocalSystem hacerse pasar por la identidad de inicio de sesión de otro usuario temporalmente? En términos generales, tengo un servicio de Windows que me gustaría ejecutar como LocalSystem, pero a veces imitar al usuario XYZ (cuando se conecta a un db usando la seguridad integrada de Windows).

Lo más importante de todo: ¿hay alguna manera de hacer esto sin conocer la contraseña del otro usuario?

Nota: si una contraseña es obligatoria, existe una estrategia recomendada para almacenar una contraseña de forma segura (c # y / o vbscript).


Es posible, aunque requiere que hagas un montón de código. Ver NtCreateToken y CreateToken . Necesita SeCreateTokenPrivilege, aunque eso no será un problema ya que se está ejecutando bajo NT AUTHORITY / SYSTEM. Luego puede usar el token creado para suplantar dentro de un hilo.


Para la parte de almacenamiento de la contraseña, es posible que desee echarle un vistazo a esta pregunta recientemente.

Esta fue mi respuesta:

Puede / debe usar DPAPI , la API de protección de datos que proporciona cifrado de almacenamiento.
Está ahí solo para este tipo de problema.

El cifrado del almacenamiento se basa en:

  • la cuenta de usuario, por lo que solo el usuario conectado puede acceder a los datos. Esto hace que los datos sean transferibles a otra PC con exactamente las mismas credenciales de usuario.
  • la máquina, haciendo que los datos solo sean accesibles en esa configuración de máquina en particular y no transferibles a otra PC.

Hay un show de dnrTV con Karl Franklin que muestra exactamente lo que se necesita para implementar esto y otras funciones de cifrado.
El código fuente del programa también está disponible en la página.

Hay, por supuesto, muchos otros artículos sobre ese tema.


Respuesta corta: no puede hacerlo sin la contraseña del usuario o el usuario que llama a su servicio a través de COM.

Para hacerse pasar por otro usuario en su proceso, debe llamar a ImpersonateLoggedOnUser . ImpersonateLoggedOnUser requiere un identificador de token. Hay varias formas de obtener el control token: