visual studio setup servicio services crear c# .net service

c# - studio - ¿Problemas de permisos al iniciar la aplicación.NET desde el servicio.NET como un usuario diferente?



windows service visual studio 2015 (4)

Intentaría crear el proceso en el contexto suplantado del usuario recién creado como se muestra a continuación.

[DllImport("advapi32.DLL", SetLastError = true)] public static extern int LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public extern static bool CloseHandle(IntPtr handle); [DllImport("advapi32.DLL")] public static extern bool ImpersonateLoggedOnUser(IntPtr hToken); static void Main() { IntPtr admin_token = new IntPtr(); WindowsIdentity wid_admin = null; WindowsImpersonationContext wic = null; LogonUser("username", "domain", "password", 9, 3, out admin_token); wid_admin = new WindowsIdentity(admin_token); wic = wid_admin.Impersonate(); _process = new Process { StartInfo = { Arguments = " -debug", FileName = instanceDirectory + "host.exe", WorkingDirectory = instanceDirectory, UseShellExecute = false, RedirectStandardError = true, RedirectStandardOutput = true, RedirectStandardInput = true, UserName = Helpers.GetUserNameForInstance(_hostid), Password = _hostpass, Domain = "" }, EnableRaisingEvents = true }; if (wic != null) wic.Undo(); CloseHandle(admin_token); }

Estoy intentando iniciar una aplicación .NET bajo un usuario diferente de un servicio .NET. La idea es crear una aplicación de hospedaje en un sandbox en Windows. En el servicio, programé el usuario en Windows, programé una carpeta para ese usuario y descargué el host .exe de un servidor en esa carpeta. Luego ejecuto el host .exe usando System.Diagnostics.Process. Aquí está el StartInfo para el proceso:

_process = new Process { StartInfo = { Arguments = " -debug", FileName = instanceDirectory + "host.exe", WorkingDirectory = instanceDirectory, UseShellExecute = false, RedirectStandardError = true, RedirectStandardOutput = true, RedirectStandardInput = true, UserName = Helpers.GetUserNameForInstance(_hostid), Password = _hostpass, Domain = "" }, EnableRaisingEvents = true };

Cuando ejecuto el servicio como un SERVICIO, el proceso se bloquea instantáneamente con un código de error de -1073741502. pero cuando ejecuto el servicio como el mismo usuario especificado en el servicio de Windows pero interactivamente en la consola, todo funciona bien. Esto solo ocurre cuando se ejecuta el servicio como un SERVICIO y no directamente en la consola.

Cualquier ayuda sería muy apreciada. Esto ha sido un dolor de cabeza durante mucho tiempo y este es un último recurso :(


Parece que usar el new Process() con un nombre de usuario y contraseña y el modo de Servicio "no computa" :)

Cita de MSDN:

Puede cambiar los parámetros especificados en la propiedad StartInfo hasta el momento en que llame al método Start en el proceso. Después de iniciar el proceso, el cambio de los valores de StartInfo no afecta ni reinicia el proceso asociado. Si llama al método Start (ProcessStartInfo) con las propiedades de ProcessStartInfo .. ::. UserName y ProcessStartInfo. es verdadero o el valor de la propiedad WindowStyle está Oculto.

Además, mirando la documentación de CreateProcessWithLogonW:

lpStartupInfo [en]

Un puntero a una estructura STARTUPINFO. La aplicación debe agregar permiso para la cuenta de usuario especificada a la estación de la ventana y al escritorio especificados, incluso para WinSta0 / Predeterminado.

Si el miembro lpDesktop es NULL o una cadena vacía, el nuevo proceso hereda el escritorio y la estación de la ventana de su proceso principal. La aplicación debe agregar permiso para la cuenta de usuario especificada a la estación de la ventana y al escritorio heredados.

No hay lpDesktop en .NET StartupInfo, por otra parte, el usuario del SERVICIO no tiene escritorio, lo que podría causar su problema.

En pocas palabras, intente establecer el LoadUserProfile en true para cargar la información del usuario desde el registro, o quizás necesite configurar el directorio de trabajo, etc.

Para investigar más a fondo, debe verificar su entorno y tal vez registrar a qué archivos se accede usando FileMon.



0xc0000142 (-1073741502) es STATUS_DLL_INIT_FAILED:

Falló la inicialización de la biblioteca de enlace dinámico [nombre]. El proceso está terminando anormalmente.

Como señaló el sitio web TenaciousImpy, debe otorgar permisos de cuenta a la estación de la ventana y al escritorio. Pero si el programa es interactivo, también debe configurar el ID de sesión del token de proceso.