Установите службу Windows с действием восстановления для перезапуска

88

Я установка службы Windows с помощью ServiceProcessInstallerи ServiceInstallerклассов.

Я использовал, ServiceProcessInstallerчтобы установить тип запуска, имя и т. Д. Но как мне установить действие восстановления на перезапуск?

Я знаю, что могу сделать это вручную после установки службы, перейдя в консоль управления службами и изменив настройки на вкладке восстановления свойств службы, но есть ли способ сделать это во время установки?

Вкладка "Восстановление служебных свойств"

Рэй
источник

Ответы:

99

Вы можете установить параметры восстановления с помощью sc . Следующее приведет к перезапуску службы после сбоя:

sc failure [servicename] reset= 0 actions= restart/60000

Это легко вызвать из C #:

static void SetRecoveryOptions(string serviceName)
{
    int exitCode;
    using (var process = new Process())
    {
        var startInfo = process.StartInfo;
        startInfo.FileName = "sc";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        // tell Windows that the service should restart if it fails
        startInfo.Arguments = string.Format("failure \"{0}\" reset= 0 actions= restart/60000", serviceName);

        process.Start();
        process.WaitForExit();

        exitCode = process.ExitCode;
    }

    if (exitCode != 0)
        throw new InvalidOperationException();
}
Кевин
источник
4
Обратите внимание, что вам необходимо заключить имя службы в кавычки, если оно содержит пробелы.
user626528
19
Если вы собираетесь вызвать это из обработчика установки службы Installer [] в C # при установке службы, вы можете вставить этот вызов в обработчик события «Committed», который выполнит его сразу после появления службы в Service Control Manager. Не помещайте его в диспетчер событий «AfterInstall», так как он не будет работать в самый первый раз, когда служба будет установлена ​​на коробке.
Contango
Анализ кода @Kevin Visual Studio предполагает, что объекты не должны удаляться более одного раза, process.Close()строка бесполезна.
JohnTube
1
@ JohnTube - удалена строка process.Close ()
Кевин
23
Обратите внимание, что синтаксис может показаться некоторым странным, но reset= 0он правильный и reset=0неправильный. Правильное использование пробелов имеет решающее значение, reset=это один аргумент, за которым следует пробел 0.
Лиам
12

После многих попыток я решил это с помощью приложения командной строки sc .

У меня есть командный файл с installutil и sc. Мой командный файл похож на:

installutil.exe "path to your service.exe"
sc failure "your service name" reset= 300 command= "some exe file to execute" actions= restart/20000/run/1000/reboot/1000

Если вам нужна полная документация по команде sc, перейдите по этой ссылке: SC.exe: взаимодействует с контроллером служб и установленными службами.

Примечание. После каждого символа равенства (=) необходимо добавить пробел. Пример: reset = 300

Хуан Карлос Велес
источник
2

Я нашел следующий проект, который заботится об этих настройках, используя только код и вызовы Win API:
http://code.msdn.microsoft.com/windowsdesktop/CSWindowsServiceRecoveryPro-2147e7ac

Рон Кляйн
источник
Ваша ссылка не работает! Ссылка только ответы плохие!
AaA
Ссылка работает и это лучшее решение. Работает без запуска процесса.
Piedone