2011-12-01 13 views
5

Creo un servicio que está definido para iniciar sesión como administrador.
Este servicio realiza el sistema ("uso de red Z: \ .../usuario: contraseña de usuario") y finaliza correctamente.La unidad de red no está disponible si está mapeada por el servicio

Si yo (como Administrador) ejecuto "net use" veo Z: de hecho agregado, pero con estado - no disponible.

Intenté agregar ImpersonateLoggedOnUser al servicio, pero eso no ayudó.

SO: Win XP

¿Qué me falta?

+0

¿Funciona http://www.ljcreate.com/support/faqs/answers.asp?ID=1254? –

+0

Agregó "OS: Win XP", así que no realmente, pero gracias. –

+0

Existen varias formas (complicadas) de hacerlo. Uno es duplicar el token de usuario asociado con uno de los procesos interactivos y luego llamar a CreateProcessAsUser. Otro es inyectando una llamada a NetUseAdd en uno de los procesos interactivos. Pero, desde el principio, sería más sensato simplemente ejecutar su código en el contexto interactivo. Para reiterar la pregunta de Werner: ¿qué estás tratando de hacer? –

Respuesta

5

ImpersonateLoggedOnUser no suplanta la sesión de inicio de sesión desde el token de usuario, solo el contexto de seguridad. CreateProcessAsUser, sin embargo, debería poder crear un nuevo proceso en la sesión de inicio de sesión asociada con el token de usuario especificado.

Tenga en cuenta que llamar a LogonUser para obtener un token de usuario para CreateProcessAsUser no funcionará, porque este token no estará en la misma sesión de inicio de sesión que el usuario que ha iniciado sesión. Tienes que encontrar uno de los procesos del usuario y duplicar su token.

Las sesiones de inicio de sesión no están bien documentadas, pero todo lo que necesita saber es que cada vez que se autentica un usuario se crea una sesión de inicio de sesión distinta y cada sesión de inicio de sesión tiene un conjunto distinto de asignaciones de unidad de red. Las sesiones de inicio de sesión no son lo mismo que las sesiones de servicios de terminal.

En Windows Vista y versiones posteriores, se crean dos sesiones de inicio de sesión cuando un usuario administrativo inicia sesión, uno asociado con el token restringido y otro asociado con el token elevado.

Puede buscar la sesión de inicio de sesión asociada con un token utilizando la función GetTokenInformation con la opción TokenStatistics. La sesión de inicio de sesión se identifica mediante AuthenticationId LUID.

Para que esto funcione, su servicio primero debería averiguar cuándo un usuario inició sesión, esperar que se inicie un proceso asociado con la nueva sesión, asegurarse de que no sea un proceso elevado y duplicar el token de acceso.

En su lugar, su mejor opción será dividir la aplicación en dos componentes. Un componente se ejecutará como el usuario (probablemente lo ejecutará automáticamente con la tecla Ejecutar) y será responsable de mapear la unidad de red. Puede ponerse en contacto con el servicio para obtener la información que necesita, ya sea a través de una tubería con nombre o una clave de registro.

3

Windows inicia sesión en el Administrador y utiliza el token de inicio de sesión para iniciar el servicio. Si inicia sesión de forma interactiva, Windows crea un token de inicio de sesión para usted. Los dos tokens no están relacionados entre sí. Los dispositivos asignados se asignan para un token de sesión/inicio de sesión, por lo tanto, si el servicio asigna un dispositivo, no lo verá en su sesión de inicio de sesión.

+0

Eso explica el problema, pero ¿se puede resolver? ¿Puedo suplantar el token interactivo? ¿Puedo crear una asignación para más de 1 sesión? ¿Algún tipo de solución? –

+0

Tal vez pueda decir lo que quiere lograr y por qué creer que el servicio debería crear una asignación de unidad para el usuario conectado de manera interactiva. –

Cuestiones relacionadas