我有一项服务,我想在注册表中为其设置 FailureAction 的数据值。当前在注册表中设置了值。使用 RegKey.SetValue("FailureActions", Value) 设置值;
我想知道:
1) 这些字节的Value如何对应于服务的恢复选项(比如如何在注册表中找出特定的序列意味着将'First failure'设置为'Restart the Service')
2) 我还需要更改注册表 FailureAction,它将对应于“后续失败”作为“重新启动服务”
这是我使用试错法的发现:
a) 手动更改服务恢复设置,然后更改注册表项。复制该值并在代码中使用。它设置了“后续失败”
b) 在代码中更改原始值。它设置了“后续失败”
但是 a) 和 b) 的值不匹配,但如果我右键单击服务并查看恢复选项,我会看到相同的结果。为了理解这一点,我想知道问题 1) 和 2) 的答案。
感谢您的评论\线索。
最佳答案
为了解释 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
是 lpsaActions
指向的 SC_ACTION
类型数组的内容。我们有这个结构的 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 毫秒 == 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/