如何从服务中可靠地捕获 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 登录、注销、锁定和解锁事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 .NET Windows 服务检测登录、注销和切换用户事件?

如何用命令行强制注销windows当前已登录用户

如何在我的 Pentaho CDE 仪表板中添加注销按钮?

从登录和注销中获取通知

PHP:如何使用 JWT 从 API 注销

如何在 Spring Security 无状态(jwt 令牌)中注销用户?