需要一种以编程方式检查 Windows 服务状态的方法

2022-09-04 05:58:22

情况如下:

我被要求使用InstallAnywhere 8,一种基于Java的安装程序IDE,它允许启动和停止Windows服务,但没有内置方法来查询它们的状态。幸运的是,它允许您在Java中创建自定义操作,这些操作可以在安装过程中随时调用(通过我认为相当复杂的API)。

我只需要一些东西来告诉我特定服务是启动还是停止。

IDE还允许调用批处理脚本,因此这也是一个选项,尽管一旦脚本运行,几乎无法验证它是否成功,所以我试图避免这种情况。

欢迎任何建议或批评。


答案 1

这是我必须做的。它很丑陋,但它工作得很好。

String STATE_PREFIX = "STATE              : ";

String s = runProcess("sc query \""+serviceName+"\"");
// check that the temp string contains the status prefix
int ix = s.indexOf(STATE_PREFIX);
if (ix >= 0) {
  // compare status number to one of the states
  String stateStr = s.substring(ix+STATE_PREFIX.length(), ix+STATE_PREFIX.length() + 1);
  int state = Integer.parseInt(stateStr);
  switch(state) {
    case (1): // service stopped
      break;
    case (4): // service started
      break;
   }
}

runProcess是一个私有方法,它将给定字符串作为命令行进程运行并返回结果输出。正如我所说,丑陋,但有效。希望这有帮助。


答案 2

您可以动态创建一个小的VBS,启动它并捕获其返回代码。

import java.io.File;
import java.io.FileWriter;

public class VBSUtils {
  private VBSUtils() {  }

  public static boolean isServiceRunning(String serviceName) {
    try {
        File file = File.createTempFile("realhowto",".vbs");
        file.deleteOnExit();
        FileWriter fw = new java.io.FileWriter(file);

        String vbs = "Set sh = CreateObject(\"Shell.Application\") \n"
                   + "If sh.IsServiceRunning(\""+ serviceName +"\") Then \n"
                   + "   wscript.Quit(1) \n"
                   + "End If \n"
                   + "wscript.Quit(0) \n";
        fw.write(vbs);
        fw.close();
        Process p = Runtime.getRuntime().exec("wscript " + file.getPath());
        p.waitFor();
        return (p.exitValue() == 1);
    }
    catch(Exception e){
        e.printStackTrace();
    }
    return false;
  }


  public static void main(String[] args){
    //
    // DEMO
    //
    String result = "";
    msgBox("Check if service 'Themes' is running (should be yes)");
    result = isServiceRunning("Themes") ? "" : " NOT ";
    msgBox("service 'Themes' is " + result + " running ");

    msgBox("Check if service 'foo' is running (should be no)");
    result = isServiceRunning("foo") ? "" : " NOT ";
    msgBox("service 'foo' is " + result + " running ");
  }

  public static void msgBox(String msg) {
    javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
       null, msg, "VBSUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
  }
}

推荐