2011-11-29 11 views
6

¿Es posible que un servicio C# Windows que se ejecute como Local System o Local Service se haga pasar por otro usuario sin necesidad de una contraseña para ese usuario?¿Es posible que un servicio de Windows suplante a un usuario sin una contraseña?

¿Cómo se haría esto?

Nota: Mi motivación para esto es poder ejecutar consultas WMI específicas del usuario en un servicio. Las llamadas de WMI que realizo (a la API WMI de OfflineFiles) son sensibles al usuario, y solo funcionan cuando ejecuto mi servicio como el usuario cuyos datos deseo consultar. No quiero que los usuarios tengan que ingresar sus nombres de usuario y contraseñas al instalar el servicio, por lo que me gustaría simplemente ejecutar el servicio como Sistema Local o algo así, y suplantar al usuario que me importa.

+0

Sospecho que tendrás más suerte si explicas qué quieres que haga el servicio una vez que haya imitado a un usuario. AFAIK, lo que está pidiendo no es posible sin almacenar las credenciales (lo que significa que el usuario ingresa una contraseña en algún momento) –

+0

@ChrisShain, he actualizado la pregunta tal como sugirió. – Eric

+0

Consulte las respuestas a esta pregunta: http://stackoverflow.com/questions/559719/windows-impersonation-from-c-sharp –

Respuesta

7

Suponiendo que sólo se necesita Inicio suplantación mientras que el usuario correspondiente se registra en, usted podría:

  1. Localizar sesión de usuario relevante utilizando EnumProcesses (por ejemplo http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx) [winapi]
  2. OpenProcessToken() en proceso de usuario relevante [winapi]
  3. DuplicateToken() con privilegios de suplantación [winapi]
  4. Crear un nuevo WindowsIdentity() con el resultado de DuplicateToken
  5. Cal l. Suplantar en su nueva identidad del paso 4

Una vez que el token se ha duplicado, no importa si el usuario registra la suplantación en su servicio.

Al parecer, la API de la función winapi ZwCreateToken indocumentada puede lograr esto aunque también, pero nunca lo he usado y puede romperse en cualquier momento en el futuro.

+0

para # 1, también puede usar 'Process.GetProcesses()' –

+0

De hecho hay un tipo de técnica usando S4U (servicio para el usuario): https://blogs.msdn.microsoft.com/winsdk/2015/08/28/inicio de sesión como usuario sin contraseña/ https://msdn.microsoft.com/en-us/library/windows/desktop/aa378128(v=vs.85).aspx –

-1

Topshelf servicio de ventana API/Tool lo admite y es de código abierto. [actualización] Me perdí que necesita la contraseña al menos para una configuración única.

+0

¿Dónde dice esto que puede suplantar a un usuario sin su contraseña? – BlackICE

+0

¿Dónde en la documentación de TS habla de esta característica? Estaría * muy * interesado en ver su implementación. –

+0

@David, por supuesto que necesitas la contraseña. – kenny

0

Que yo sepa, no se puede hacer por obvias razones de seguridad. Debe tener la contraseña para llamar a LogonUser, luego WindowsIdentity.Impersonate.

La única excepción: si tenía una WindowsIdentity existente pasada al servicio a través de una llamada remota, puede hacerse pasar por esa identidad de Windows en el servicio, pero las aplicaciones tampoco funcionan de esta manera.

+1

Las razones de seguridad no son obvias: si usted es un servicio que se ejecuta con una cuenta de sistema local, realmente no hay nada que no pueda hacer. – EFraim

Cuestiones relacionadas