为服务

时间:2016-04-06 21:23:29

标签: c# service recovery

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

我想知道:

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

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

以下是我使用试错法的结果:

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

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

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

感谢您的评论\ clue。

1 个答案:

答案 0 :(得分:8)

为了解释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 00SC_ACTION指向的lpsaActions类型数组的内容。我们有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 ms = = 60000毫秒== 60秒)。"第二行意味着相同。第三行表示"如果失败,请在0秒(00 00 00 00)"

之后不采取任何行动(00 00 00 00

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