开发者

Start/Stop services using JNA

开发者 https://www.devze.com 2023-03-23 16:34 出处:网络
I am writing a utility to start and stop windows services.The program will be distributed across many computers with differing levels of u开发者_如何学JAVAser privileges so I don\'t want to use the co

I am writing a utility to start and stop windows services. The program will be distributed across many computers with differing levels of u开发者_如何学JAVAser privileges so I don't want to use the command line. I've tried using 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();
      }


    }
}

When I run the program I get the following error

com.sun.jna.platform.win32.Win32Exception: The handle is invalid. at com.sun.jna.platform.win32.W32ServiceManager.openService(W32ServiceManager.java:77) at windowsservices.WindowsServices.main(WindowsServices.java:26)

Any suggestions would be most helpful.


Thanks for the suggestion the author of the question found the 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();
        }
    }
}

The error was that the code didn't open the Service Control Manager. I was looking on MSDN and found the process that I needed to follow. I also chanced the permission value, that might also of caused a failure.


We use Runtime.getRuntime().exec(command) and then execute the command

cmd /c net start

to start services and

cmd /c net stop

to stop services.

Of course you have to know the service names (and in our case it is DB2 we are after). But this has worked for us.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号