2009-06-07 14 views
9

Necesito cambiar el usuario de inicio de sesión de un servicio de Windows mediante programación. Y estoy usando el siguiente código para hacer esto:Cambiar el usuario del servicio de Windows mediante programación

string objPath = string.Format("Win32_Service.Name='{0}'", ServiceName); 
using (ManagementObject service = new ManagementObject(new ManagementPath(objPath))) 
{ 
object[] wmiParams = new object[11]; 

if (PredefinedAccount) 
    { 
     wmiParams[6] = "LocalSystem"; 
      wmiParams[7] = ""; 
    } 
    else 
    { 
     wmiParams[6] = ServiceUsername; // provided by user 
      wmiParams[7] = ServicePassword; // provided by user 
    } 

    object invokeResult = service.InvokeMethod("Change", wmiParams); 

// handle invokeResult - no error up to this point 
} 

Este código funciona en el 90% de las situaciones, pero en algunas situaciones el servicio no se puede iniciar debido a la Falta de la conexión. Generalmente, no hay error en InvokeMetod pero cuando tratamos de iniciar el servicio obtenemos el siguiente error:

System.InvalidOperationException: Cannot start service X on computer '.'. --> System.ComponentModel.Win32Exception: The service did not start due to a logon failure.

La solución solución es sencilla, sólo tenemos que introducir las mismas credenciales a través de la interfaz de Windows y el problema está resuelto.

Así que mi pregunta es, ¿alguien ha experimentado el problema similar con ManagementObject porque parece que en alguna situación no se relaciona nombre de usuario y contraseña para el servicio de Windows?

+1

Me pregunto si es debido a su instrucción using. Lo que quiero decir es que ManagementObject se destruye antes de que se pueda completar? No estoy demasiado familiarizado con WMI, así que no estoy seguro. – HVS

+0

Como el nombre de usuario y la contraseña han sido ingresados ​​por el usuario, buscaría también allí los problemas. Asegúrate de que sean nombres válidos. "DOMINIO \ nombre de usuario" es bueno en cualquier sistema, pero 'nombre de usuario @ DOMINIO' no funciona en Windows 2000 y versiones anteriores. – HVS

+0

Tenemos el mismo problema y estoy bastante seguro de que el servicio se instaló con un programa de instalación de C#, .net 1.1. Comienzo el servicio desde la línea de comando ('net start') y obtengo un error de inicio de sesión. Extrañamente, esto sucede con 2 de los 7 servicios que están instalados en la máquina (probablemente usando el mismo código de instalación). Aún no llegué a diagnosticarlo, pero la máquina es el servidor de Windows 2003 con los últimos service packs. Los servicios son código c .net 2.0. Escribir la contraseña la arregla manualmente hasta que se reinicia. – LegendLength

Respuesta

0

¿Hay algún patrón entre esas fallas? La misma máquina? Mismo sistema operativo? Mismo usuario? ¿Tiene el usuario los derechos "logon as service" o "logon interactively"? Personalmente, no estoy familiarizado con este método de especificar al usuario para un servicio. Pensé que tendrías que reiniciar el servicio, pero supongo que no si funciona el 90% del tiempo.

+0

Bueno, depende de varios sistemas operativos. No hay un patrón Algunas veces esto ocurre si la contraseña es corta (menos de 7 caracteres). En todos estos casos, el problema se resolvió cuando el usuario ingresaba el mismo nombre de usuario y contraseña a través de la interfaz predeterminada de Windows. Así que suponemos que es algo en nuestro código o el ManagementObject que estamos usando. – Anne

9

No estoy seguro de si este problema está resuelto. Pero acabamos de encontrar el problema similar y descubrimos que es porque la cuenta no tiene el privilegio de "Iniciar sesión como servicio". Necesita usar LsaAddAccountRights para agregar dicho privilegio a la cuenta.

Ver este artículo por favor:

How To Manage User Privileges Programmatically in Windows NT

+0

Brillante !!! Ese fue mi problema, gracias por publicar esto. – lidermin

Cuestiones relacionadas