4

我有一个诊断版本的服务,它尽可能多地记录在 OnStart() 和 OnStop() 方法中。

我无法捕获的一个事件是计算机物理重新启动时。我的日志功能通常将其输出记录到数据库中的表中,但是当它不可用时,它会发布到 EventLog。

在重新启动时,我的服务既不记录到表也不记录到 EventLog。

对我来说,我无法发布到表是有道理的,因为 SQL Server 正在关闭,但似乎由于时间问题,EventLog 也可能在服务默认为之前关闭写在那里。

在关闭的情况下,MSSQLSERVER 在 EventLog 中报告一条信息消息:

SQL Server 由于系统关闭而终止。这只是一条信息性消息。无需用户操作。

有没有办法为我的服务做类似的事情?

4

4 回答 4

3

您可以在服务中覆盖一个 OnShutdown 方法。机器关闭时会调用它。从该方法写入事件日志,然后调用 base.OnShutdown()。

于 2010-02-24T18:13:06.297 回答
3

您可以指定 Windows 服务的依赖关系,使其需要其他服务。如果您指定对 EventLog 服务的依赖关系,则 Windows 将等到您的服务关闭后再关闭 Event Log。

http://kb2.adobe.com/cps/400/kb400960.html描述了如何通过修改一些注册表项来做到这一点。

导航到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 并找到您需要为其设置依赖关系的服务。打开右侧的“DependOnService”键。如果所选服务没有“DependOnService”键,则通过右键单击并选择“新建”>“多字符串值”来创建一个。在值字段中,输入当前服务将依赖的所有服务的名称。必须正确输入每个服务名称并在单独的行上。

于 2010-02-24T18:14:00.897 回答
0

捕获SystemEvents.SessionEnding

在 OnStart 上,您可以捕获并处理

Microsoft.Win32.SystemEvents.SessionEnding += new Microsoft.Win32.SessionEndingEventHandler(this.zomgRebootinglol);
于 2010-02-24T18:14:43.947 回答
0

您可以使用SystemEvents-Class捕获 Windows 事件。

也看看事件。我认为您正在寻找的事件是:SystemEvents::PowerModeChanged 事件和/或SystemEvents::SessionEnded

于 2010-02-24T18:15:51.203 回答