c# - 为服务的 FailureAction 设置什么 REG-BINARY

标签 c# service recovery

我有一项服务,我想在注册表中为其设置 FailureAction 的数据值。当前在注册表中设置了值。使用 RegKey.SetValue("FailureActions", Value) 设置值;

我想知道:

1) 这些字节的Value如何对应于服务的恢复选项(比如如何在注册表中找出特定的序列意味着将'First failure'设置为'Restart the Service')

2) 我还需要更改注册表 FailureAction,它将对应于“后续失败”作为“重新启动服务”

这是我使用试错法的发现:

a) 手动更改服务恢复设置,然后更改注册表项。复制该值并在代码中使用。它设置了“后续失败”

b) 在代码中更改原始值。它设置了“后续失败”

但是 a) 和 b) 的值不匹配,但如果我右键单击服务并查看恢复选项,我会看到相同的结果。为了理解这一点,我想知道问题 1) 和 2) 的答案。

感谢您的评论\线索。

最佳答案

为了解释 FailureActions 注册表项的数据值中字节的含义,我将举这个例子:

enter image description here

这个表示中的字节对应这个结构:

typedef struct _SERVICE_FAILURE_ACTIONS {
    DWORD     dwResetPeriod;
    LPTSTR    lpRebootMsg;
    LPTSTR    lpCommand;
    DWORD     cActions;
    SC_ACTION *lpsaActions;
} SERVICE_FAILURE_ACTIONS, *LPSERVICE_FAILURE_ACTIONS;

前四个字节80 51 01 00dwResetPeriod结构成员的值。如果没有失败,这是将失败计数重置为零的时间。它以秒为单位计算。在这个例子中,重置周期是 0x15180 秒(因为小端)。在十进制中,它相当于 86400 秒或等于 24 小时。因此,如果在 24 小时内没有发生故障,则故障计数将重置为零。

接下来的四个字节00 00 00 00对应于lpRebootMsg。有关此结构成员和下一个成员的更多信息,请参见 here

接下来的四个字节 00 00 00 00 对应于 lpCommand

接下来的四个字节 03 00 00 00 对应于 cActions。该成员是 lpsaActions 数组中的元素数。在这种情况下,我们有 3 个元素。

接下来的四个字节 14 00 00 00 对应于 lpsaActions,它是指向 SA_ACTION 类型数组的指针。

最后,01 00 00 00 60 EA 00 00 01 00 00 00 60 EA 00 00 00 00 00 00 00 00 00 00lpsaActions 指向的 SC_ACTION 类型数组的内容。我们有这个结构的 3 个实例对应于 3 行字节。结构 SC_ACTION 声明如下:

typedef struct _SC_ACTION {
    SC_ACTION_TYPE Type;
    DWORD          Delay;
} SC_ACTION, *LPSC_ACTION;

有关SC_ACTIONSC_ACTION_TYPE 的更多信息,请参见here .

因此,第一行 01 00 00 00 60 EA 00 00 表示:“如果出现故障,请在 60 后重启服务 (01 00 00 00)秒(60 EA 00 00 == 到 0xEA60 毫秒 == 60000 毫秒 == 60 秒)。第二行意思相同。第三行表示“在失败的情况下,在 0 秒(00 00 00 00)后不采取任何操作(00 00 00 00)”

这是如何运作的?每次服务失败时,服务 Controller 都会增加失败计数 N 并采取 lpsaActions 指向的数组中指定的操作 N-1。在我们的例子中,第一次服务失败时,N 递增到 1, Controller 将执行由 0 索引的操作,这意味着在 60 秒后重新启动服务。第二次失败时,N 增加到 2 并采取操作 N-1 = 1,这意味着在 60 秒后重新启动服务。服务第三次失败时, Controller 执行数组中的最后一个操作,在我们的例子中是不采取任何操作。如果 N 大于 cActions,则服务 Controller 重复数组中的最后一个操作。在这种情况下,服务不再启动。

关于c# - 为服务的 FailureAction 设置什么 REG-BINARY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36462623/

相关文章:

c# - HttpClient 查询偶尔挂起

Android 前台服务通知替换

postgresql - 我如何修复 Postgres 以便它在突然关闭后启动?

design-patterns - 具有检查点和恢复的事务服务的设计模式

c# - 指定主键等信息是否会影响 EntityFramework 性能?

c# - Visual Studio 2019 Blazor 服务器端项目太慢了

javascript - AngularJS 模型和服务注入(inject)错误

python - 从内存中恢复 Python 脚本,我搞砸了

c# - 从 C# 最小化 Microsoft Edge 浏览器不起作用

service - kubernetes 服务如何运作?