【问题标题】:Start/Stop services using JNA使用 JNA 启动/停止服务
【发布时间】:2011-10-16 02:03:05
【问题描述】:

我正在编写一个实用程序来启动和停止 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:句柄无效。 在 com.sun.jna.platform.win32.W32ServiceManager.openService(W32ServiceManager.java:77) 在 windowsservices.WindowsServices.main(WindowsServices.java:26)

任何建议都会很有帮助。

【问题讨论】:

  • 这很酷,不知道你可以使用 JNA 轻松控制 Windows 服务。
  • 我发现这种方法的唯一问题是,当您尝试停止服务时,您必须提供额外的 try/catch 块,因为某些服务从运行到停止需要一段时间。

标签: java winapi windows-services jna


【解决方案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 上查找并找到了我需要遵循的过程。我还偶然发现了权限值,这也可能导致失败。

【讨论】:

    【解决方案2】:

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

    cmd /c 网络启动

    启动服务和

    cmd /c 网络停止

    停止服务。

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

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      相关资源
      最近更新 更多