Команда CMD для удаленного запуска службы, которая не выполняется в коде, а выполняется в CMD - PullRequest
0 голосов
/ 28 июня 2019

Я создаю функциональность для удаленного перезапуска служб Windows, но встроенная в код строковая команда не возвращает желаемый вывод, копирование той же команды при отладке из IDE и ее запуск в CMD выполняется успешно.

Я попытался перейти от использования метода Process cmdOutput Runtime.getRuntime (). Exec (команда) к процессу cmdOutput Runtime.getRuntime (). Exec (команда []). Я пытался по-разному манипулировать моей строковой командой, чтобы определить, будет ли она выполнена безуспешно.

Я смотрел на подобные вопросы в 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 Ответ

0 голосов
/ 01 июля 2019

После нескольких часов борьбы простое решение состояло в том, чтобы разделить команды на две части, часть учетных данных и часть команд sc, как показано ниже. Теперь все работает как положено.

PS. Я решил удалить 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...