【问题标题】:Install Windows Service with Recovery action to Restart安装带有恢复操作的 Windows 服务以重新启动
【发布时间】:2018-09-24 16:55:02
【问题描述】:

我正在使用 ServiceProcessInstallerServiceInstaller 类安装 Windows 服务。

我已经使用ServiceProcessInstaller 设置了启动类型、名称等。但是如何将恢复操作设置为重新启动?

我知道我可以在安装服务后手动执行此操作,方法是转到服务管理控制台并更改服务属性的恢复选项卡上的设置,但有没有办法在安装期间执行此操作?

【问题讨论】:

    标签: .net windows-services service


    【解决方案1】:

    您可以使用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();
    }
    

    【讨论】:

    • 请注意,如果服务名称包含空格,则需要在引号中包含服务名称。
    • 如果您要在安装服务时从 C# 中的 Installer[] 服务安装处理程序调用它,您可以将此调用插入到“已提交”事件处理程序中,该处理程序将在服务出现在服务控制管理器中。不要将它放在“AfterInstall”事件管理器中,因为它在第一次安装在盒子上时不起作用。
    • @Kevin Visual Studio 的代码分析建议对象不应该被释放超过一次,process.Close() 行没用。
    • @JohnTube--删除了 process.Close() 行
    • 请注意,语法对某些人来说可能看起来很奇怪,但reset= 0 是正确的,reset=0 是不正确的。正确使用空格很关键,reset= 是一个参数,后跟一个空格,然后是0
    【解决方案2】:

    经过多次尝试,我使用 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: Communicates with the Service Controller and installed services

    注意:您需要在每个等号 (=) 后添加一个空格。示例:reset=300

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        我发现以下项目负责处理这些设置,仅使用代码和 Win API 调用:
        http://code.msdn.microsoft.com/windowsdesktop/CSWindowsServiceRecoveryPro-2147e7ac

        【讨论】:

        • 您的链接已损坏! Link only answers are bad!
        • 链接有效,这是最好的解决方案。无需进程启动即可工作。
        猜你喜欢
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多