Выполняется sc.exe из процесса .NET не удается запустить и остановить службу
-
06-07-2019 - |
Вопрос
Я пытаюсь перезапустить службу с удаленного компьютера.Вот мой код.Проблема в том, что мне нужно ввести 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 " + сервер + " Стоп " + база данных;