2010-07-12 16 views
5

estoy usando el siguiente código en una aplicación de C# WinForms para iniciar los servicios de Windows en un PC remotoIniciar un servicio remoto desde C#

public static List<Service> GetServices() 
    { 
     List<Service> Services = new List<Service>(); 
     ServiceController[] sc = ServiceController.GetServices(Server); 
     foreach (var s in sc) 
     { 
      Services.Add(new Service { Name = s.ServiceName, Running = s.Status == ServiceControllerStatus.Running }); 
     } 
     return Services; 
    } 

    public static bool StartService(string ServiceName) 
    { 
     try 
     { 
      ServiceController sc = new ServiceController(ServiceName, Server); 
      sc.Start(); 
      sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 10)); 
      sc.Refresh(); 
      return sc.Status == ServiceControllerStatus.Running; 
     } 
     catch(Exception ex) { return false; } 
    } 

El método GetServices funciona bien cuando se apunta en mi PC local o en el PC remota. Sin embargo, el método StartService solo funciona en mi PC local, cuando se ejecuta en la PC remota obtengo acceso denegado. En este caso, la PC remota es una máquina profesional de Windows XP en el mismo dominio y el usuario con el que ejecuto la aplicación tiene derechos de administrador local.

No estoy seguro de si esto es un problema con mi código o si mis permisos no son correctos.

Si se trata de un problema de permisos, avíseme y lo intentaré en ServerFault.

Gracias

+3

Primera prueba rápida, abra el Administrador de servicios y conéctese a la PC remota e intente iniciar el servicio requerido. –

+0

¿Estás seguro de que estás ejecutando tu aplicación como administrador? ¿Tiene permisos de CAS ('ServiceControllerPermission (ServiceControllerPermissionAccess.Control)' y 'SecurityPermission (PermissionState.Unrestricted)')? Primero debe comprobar si 'sc.Status == ServiceControllerStatus.Stopped'. –

+0

Ok, el Administrador de servicios también falla, así que supongo que esta es una pregunta para ServerFault gracias por la ayuda. – Gavin

Respuesta

0

Resulta que esto fue un problema de permisos. Estaba probando con una máquina virtual y nuestras VM tienen diferentes permisos de acceso en nuestro dominio.

+1

Esto es algo @conrad Frix ya respondió (12 de julio). En lugar de marcar su respuesta como respuesta a esta pregunta, respondió su propia pregunta y la marcó como respuesta. Este no es el comportamiento correcto. – Esen

4

Si resulta que, lo que desea el permiso para iniciar y detener los servicios de ventanilla en vez de tener derechos de administrador se le puede modificar la DACL del servicio.

Existen básicamente dos formas de hacerlo.

1) Ejecución del string del lenguaje de definición del descriptor de seguridad (SDDL).

2) Heredar de NativeObjectSecurity y aplicar los cambios de su DACL durante el método ServiceInstaller_AfterInstall.

Cuestiones relacionadas