2011-07-29 10 views
8

Estoy escribiendo una utilidad para iniciar y detener servicios de Windows. El programa se distribuirá en muchas computadoras con diferentes niveles de privilegios de usuario, por lo que no quiero usar la línea de comando. He intentado usar el JNA,Servicios de inicio/detención usando JNA

import com.sun.jna.platform.win32.W32Service; 
import com.sun.jna.platform.win32.W32ServiceManager; 
import com.sun.jna.platform.win32.Winsvc; 

/** 
* 
* @author 
*/ 
public class WindowsServices { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     try 
     { 

     // TODO code application logic here 
     W32ServiceManager serviceManager = new W32ServiceManager(); 

     W32Service service = serviceManager.openService("uvnc_service", Winsvc.SERVICE_ACCEPT_STOP); 
     service.stopService(); 
     service.close(); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 


    } 
} 

Cuando ejecuto el programa me sale el siguiente error

com.sun.jna.platform.win32.Win32Exception: El identificador no es válido. en com.sun.jna.platform.win32.W32ServiceManager.openService (W32ServiceManager.java:77) en windowsservices.WindowsServices.main (WindowsServices.java:26)

Cualquier sugerencia sería de gran ayuda.

+0

Esto es genial, no sabía que pudiera controlar los servicios de Windows tan fácilmente con JNA. – tmbrggmn

+0

El único problema que encontré con este método es que cuando intenta detener los servicios, debe proporcionar bloqueos adicionales try/catch porque algunos servicios tardan un tiempo en pasar de ejecutarse a detenerse. – GEverding

+0

Usted suhold agrega la respuesta como una respuesta válida – gavioto

Respuesta

0

Utilizamos Runtime.getRuntime.exec() y luego ejecutar el comando

cmd/c net start

para iniciar los servicios y

cmd/c net stop

para detener los servicios.

Por supuesto, debe conocer los nombres de los servicios (y en nuestro caso es DB2 lo que buscamos). Pero esto ha funcionado para nosotros.

1

Gracias por la sugerencia, el autor de la pregunta encontró el error.

import com.sun.jna.platform.win32.W32Service; 
import com.sun.jna.platform.win32.W32ServiceManager; 
import com.sun.jna.platform.win32.Winsvc; 

/** 
* 
* @author 
*/ 
public class WindowsServices { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     try 
     { 
      W32ServiceManager serviceManager = new W32ServiceManager(); 
      serviceManager.open(Winsvc.SC_MANAGER_ALL_ACCESS); 
      W32Service service = serviceManager.openService("uvnc_service", Winsvc.SC_MANAGER_ALL_ACCESS); 
      service.startService(); 
      service.close(); 
     } catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 

El error fue que el código no abrió el Administrador de control de servicios. Estaba buscando en MSDN y encontré el proceso que necesitaba seguir. También busqué el valor del permiso, que también podría causar un error.

+0

Esta es la buena solución – gavioto

Cuestiones relacionadas