为FailureAction设置什么REG-BINARY服务

Mag*_*agg 5 c# service recovery

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

我想知道:

1)这些字节的值如何对应于服务的恢复选项(比如如何在注册表中找出特定的序列意味着将"第一次失败"设置为"重新启动服务")

2)我还需要更改注册表FailureAction,它将"后续失败"对应为"重启服务"

以下是我使用试错法的发现:

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

b)更改代码中的原始值.它设置'后续失败'

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

感谢您的评论\线索.

小智 13

为了解释FailureActions注册表项的数据值中字节的含义,我将采用以下示例:

在此输入图像描述

此表示中的字节对应于此结构:

typedef struct _SERVICE_FAILURE_ACTIONS {
    DWORD     dwResetPeriod;
    LPTSTR    lpRebootMsg;
    LPTSTR    lpCommand;
    DWORD     cActions;
    SC_ACTION *lpsaActions;
} SERVICE_FAILURE_ACTIONS, *LPSERVICE_FAILURE_ACTIONS;
Run Code Online (Sandbox Code Playgroud)

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

接下来的四个字节00 00 00 00对应于lpRebootMsg.有关此结构的成员和下一个成员的更多信息可以在这里找到

接下来的四个字节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 00SC_ACTION指向的数组的内容lpsaActions.我们有3个这种结构的实例对应于3行字节.结构SC_ACTION声明如下:

typedef struct _SC_ACTION {
    SC_ACTION_TYPE Type;
    DWORD          Delay;
} SC_ACTION, *LPSC_ACTION;
Run Code Online (Sandbox Code Playgroud)

有关的更多信息SC_ACTION,SC_ACTION_TYPE可以在这里找到.

因此,第一行01 00 00 00 60 EA 00 00表示::"如果发生故障,请01 00 00 00在60秒后重新启动服务()(60 EA 00 00==至0xEA60 ms == 60000 ms == 60秒)." 第二行意味着相同.第三行表示"如果失败,00 00 00 00在0秒后不采取行动(00 00 00 00)" ()

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