2009-02-18 12 views
29

¿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).Suplantación de Windows de C#

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).

+0

Para ver el código de suplantación, consulte los siguientes dos artículos de Code Project: [http://www.codeproject.com/KB/cs/cpimpersonation1.aspx](http://www.codeproject.com/KB/cs/cpimpersonation1 .aspx) [http://www.codeproject.com/KB/cs/zetaimpersonator.aspx] (http://www.codeproject.com/KB/cs/zetaimpersonator.aspx) y el artículo de Microsoft KB en el que se basan: [http://support.microsoft.com/default.aspx?scid=kb; en-us; Q306158] (http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158) – mundeep

Respuesta

18

Es posible, aunque requiere que haga una gran cantidad 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.

+0

Gracias. No hay mucho en el camino de las muestras de código para eso :) – user53794

+7

Tenga en cuenta que no se recomienda ejecutar servicios bajo LocalSystem, y los administradores del sistema con razón fruncen el ceño en esta práctica. –

+27

En stackoverflow, prefiero hacer/responder lo que se me pide. – wj32

5

Para la parte de almacenamiento de la contraseña, es posible que desee echar un vistazo a this question pedido recientemente.

Esta fue mi respuesta:

Usted podría/debería usar el DPAPI, la Data Protection API que proporciona cifrado de almacenamiento.
Está ahí solo para este tipo de problema.

cifrado del almacenamiento se basa en cualquiera de los dos:

  • la cuenta de usuario, por lo que sólo el usuario que ha iniciado sesión en el se 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, por lo que los datos solo son accesibles en esa configuración particular de la máquina y no son transferibles a otra PC.

Hay un dnrTV show with 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.

Por supuesto, hay muchos other articles en ese tema.

10

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 suplantar a otro usuario en su proceso, debe llamar al ImpersonateLoggedOnUser. ImpersonateLoggedOnUser requiere un identificador de token. Hay varias formas de obtener el identificador de token:

Cuestiones relacionadas