我正在使用 ServiceProcessInstaller
和 ServiceInstaller
类来安装 Windows 服务。
我已经使用了 ServiceProcessInstaller
来设置启动类型、名称等属性。但是如何将恢复操作设置为重新启动?
我知道可以在服务安装后手动打开服务管理控制台,然后在服务属性的恢复选项卡上更改设置,但是是否有一种方法可以在安装过程中完成呢?
我正在使用 ServiceProcessInstaller
和 ServiceInstaller
类来安装 Windows 服务。
我已经使用了 ServiceProcessInstaller
来设置启动类型、名称等属性。但是如何将恢复操作设置为重新启动?
我知道可以在服务安装后手动打开服务管理控制台,然后在服务属性的恢复选项卡上更改设置,但是是否有一种方法可以在安装过程中完成呢?
你可以使用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();
}
经过多次尝试,我使用命令行应用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
reset= 0
是正确的写法,而reset=0
是错误的写法。恰当使用空格至关重要,reset=
是一个参数,后跟一个空格,然后是0
。 - Liam