Выполняется sc.exe из процесса .NET не удается запустить и остановить службу

StackOverflow https://stackoverflow.com/questions/1212241

Вопрос

Я пытаюсь перезапустить службу с удаленного компьютера.Вот мой код.Проблема в том, что мне нужно ввести startinfo.filename = "sc.exe" поскольку я ставлю "start /wait sc" это приводит к ошибке.Вот мой код, есть какие-нибудь мысли.Также, если у кого-нибудь есть какие-либо идеи, как сохранить окно cmd открытым после запуска, чтобы я мог видеть запущенный код, это было бы потрясающе.

string strCommandStop1;
string strCommandStop2;
string strCommandStart1;
string strCommandStart2;
string strServer = "\\" + txtServerName.Text;
string strDb1 = "SqlAgent$" + txtInsName.Text;
string strDb2 = "MSSQL$" + txtInsName.Text;

strCommandStop1 = @"start /wait sc " + strServer + " Stop " + strDb1;
strCommandStop2 = @"start /wait sc " + strServer + " Stop " + strDb2;
strCommandStart1 = @"start /wait sc " + strServer + " Start " + strDb2;
strCommandStart2 = @"start /wait sc " + strServer + " Start " + strDb1;

try
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.CreateNoWindow = true;

    startInfo.Arguments = strCommandStop1;
    startInfo.Arguments = strCommandStop2;
    startInfo.Arguments = strCommandStart1;
    startInfo.Arguments = strCommandStart2;
    startInfo .FileName = "sc.exe";

    Process.Start(startInfo);

}
catch (Exception e)
{
    MessageBox.Show(e.Message);
}
Это было полезно?

Решение

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

Другие советы

"start" - это встроенная команда в командной строке cmd.exe, поэтому используйте cmd.exe в качестве имени файла;

ProcessStartInfo si = new ProcessStartInfo();
si.CreateNoWindow = true;
si.Arguments = "/c start /wait sc.exe " + server + " Stop " + database;
si.FileName = "cmd.exe";
Process.Start(si);

Кроме того, ваше последовательное переназначение свойства Arguments выглядит странно.Вам нужно вызвать Process.Запустите для каждой командной строки, которую вы хотите выполнить.

Я думаю, что ваша проблема в том, что ваш объект startInfo будет на самом деле вызывать:

sc.exe start /wait sc <strServer> Start <strDb1>

Кроме того, есть ли какое-то конкретное требование, чтобы вы использовали sc вместо класса ServiceController из библиотеки System.ServiceProcess?

Спасибо всем, что я использовал класс ServiceController, и это сделало все намного проще. Спасибо за вашу помощь. J

Консоль может оставаться открытой, если вы используете cmd / k и без запуска, который, кажется, открывает новый cmd. так что это должно быть что-то вроде cmd / k sc.exe " + сервер + " Стоп " + база данных;

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top