我有一项服务,我想在注册表中为FailureAction设置数据值。目前在注册表中设置了值。使用RegKey.SetValue(“FailureActions”,Value)设置值;
我想知道:
1)这些字节的值如何对应于服务的恢复选项(比如如何在注册表中找出特定的序列意味着将'首次失败'设置为'重新启动服务')
2)另外我需要更改注册表FailureAction,它将“后续失败”对应为“重启服务”
以下是我使用试错法的结果:
a)手动更改服务恢复设置,然后更改注册表项。复制该值并在代码中使用。它设置了“后续失败”
b)更改代码中的原始值。它设置了“后续失败”
但a)和b)的值不匹配,但如果我右键单击服务并看到恢复选项,我会看到相同的结果。为了理解这一点,我想知道问题1)和2)的答案。
感谢您的评论\ clue。
答案 0 :(得分:8)
为了解释FailureActions注册表项数据值中字节的含义,我将采用这个例子:
此表示中的字节对应于此结构:
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 00
是dwResetPeriod
结构成员的值。如果没有故障,则是将故障计数重置为零的时间。它以秒为单位计算。在此示例中,重置周期为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 00
是SC_ACTION
指向的lpsaActions
类型数组的内容。我们有3个这种结构的实例对应于3行字节。结构SC_ACTION
在下面声明:
typedef struct _SC_ACTION {
SC_ACTION_TYPE Type;
DWORD Delay;
} SC_ACTION, *LPSC_ACTION;
可以找到有关SC_ACTION
和SC_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
,则服务控制器会重复数组中的最后一个操作。在这种情况下,服务不再启动。