如何从服务中可靠地捕获 Windows 登录、注销、锁定和解锁事件?
Posted
技术标签:
【中文标题】如何从服务中可靠地捕获 Windows 登录、注销、锁定和解锁事件?【英文标题】:How to reliably capture Windows logon, logoff, lock and unlock events from a service? 【发布时间】:2009-10-06 14:55:16 【问题描述】:using Microsoft.Win32;
public class App
static void Main()
SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
Console.ReadLine();
SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch;
static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
if(e.Reason == SessionSwitchReason.SessionLock)
Console.WriteLine("locked at 0", DateTime.Now);
if(e.Reason == SessionSwitchReason.SessionUnlock)
Console.WriteLine("unlocked at 0", DateTime.Now);
我创建了一个 Windows 服务。当我重新启动系统并登录、注销、锁定或解锁会话时。它不会捕获事件。服务正在运行,但无法正常运行。
当我重新启动服务时,它将按预期捕获所有事件。我该如何解决/解决这个问题?
【问题讨论】:
你想告诉我们什么...请详细说明“它不起作用”...它怎么不起作用?它有什么作用?它有什么作用? 您要专门针对哪个版本的 Windows?事件在 2000、XP 和 Vista 之间表现不同 【参考方案1】:使您的服务依赖于 TermService(终端服务服务)。在幕后,SystemEvents 类基于 WTSRegisterSessionNotification Win32 函数,如果终端服务服务在调用时尚未启动,则 is documented 将失败。通过将对 TermService 的依赖添加到您的服务中,就不会发生这种情况。您还可以使用this 之类的技术连接到 Global\TermSrvReadyEvent 全局事件,并等待注册 SystemEvent 处理程序,直到 TS“就绪”事件触发。
【讨论】:
【参考方案2】:尝试保留事件的注册状态,而不是在 readline 之后删除它 您正在注册收听,然后立即取消注册,这没有任何意义。
【讨论】:
以上是关于如何从服务中可靠地捕获 Windows 登录、注销、锁定和解锁事件?的主要内容,如果未能解决你的问题,请参考以下文章