使用JNA启动/停止服务

时间:2011-07-29 15:49:44

标签: java winapi windows-services jna

我正在编写一个实用程序来启动和停止Windows服务。该程序将分布在具有不同级别用户权限的许多计算机上,因此我不想使用命令行。我尝试过使用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();
      }


    }
}

当我运行程序时,我收到以下错误

com.sun.jna.platform.win32.Win32Exception:句柄无效。     at com.sun.jna.platform.win32.W32ServiceManager.openService(W32ServiceManager.java:77)     在windowsservices.WindowsServices.main(WindowsServices.java:26)

任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:1)

感谢有关该问题的作者发现错误的建议。

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();
        }
    }
}

错误是代码未打开服务控制管理器。我在MSDN上寻找并找到了我需要遵循的流程。我也偶然发现了许可值,这也可能导致失败。

答案 1 :(得分:0)

我们使用Runtime.getRuntime.exec()然后执行命令

  

cmd / c net start

启动服务和

  

cmd / c net stop

停止服务。

当然,您必须知道服务名称(在我们的例子中,它是我们正在使用的DB2)。但这对我们有用。