有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于远程启动服务的java CMD命令,该服务不在代码中运行,而是在CMD上运行

我正在构建远程重新启动windows服务的功能,但我在代码中内置的string命令没有返回所需的输出,在从IDE调试并在CMD上运行该命令时复制了相同的命令并成功执行

我已尝试从使用方法Process cmdOutput Runtime更改。getRuntime()。exec(命令)以在运行时处理cmdOutput。getRuntime()。exec(命令[]) 我尝试过以不同的方式操纵我的string命令,看看它是否会接受它,但没有成功

我看过StackOverflow上的类似问题,但没有一个是我正在经历的

public void startService(int serviceId, String serviceName, String 
ipAddress) {
    CMDExecutor executor = new CMDExecutor();
    try {
        String command = "cmd /C echo "+ password +" runas /user:"+ 
username +" "+ "\""+
                System.lineSeparator() +" sc\\\\"  +ipAddress+ " start "+ 
serviceName + "\"";
        String result = executor.getCMDResult(command);
        logger.info(result);
}

public class CMDExecutor {
public String getCMDResult(String command) throws IOException {
    Process cmdOutput;
    cmdOutput = Runtime.getRuntime().exec(command);
    StringWriter writer = new StringWriter();
    IOUtils.copy(cmdOutput.getInputStream(), writer, "UTF-8");
    return writer.toString();
 }
}

我期待下面的消息

SERVICE_NAME: serviceName
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x7d0
        PID                : 34916
        FLAGS              :

我得到了部分命令,但没有任何变化,服务无法启动


共 (1) 个答案

  1. # 1 楼答案

    经过数小时的努力,简单的解决方案是将命令分成两部分,凭证部分和sc命令部分,如下所示。现在,它的工作如预期

    另外,我选择从命令中删除echo,以避免在日志文件中打印凭据

    public void startService(int serviceId, String serviceName, String 
    ipAddress) {
    CMDExecutor executor = new CMDExecutor();
    try {
    String credentialsCommand = "cmd /C echo "+ password +" runas /user:"+ username;
    String startServiceCommand = "sc\\\\"  +ipAddress+ " start "+ serviceName";
    String credentialsResult = executor.getCMDResult(credentialsCommand );
    logger.info(credentialsResult );
    String startServiceResult= executor.getCMDResult(startServiceCommand );
    logger.info(startServiceResult);
    }