Windows服务:会话解锁事件与快速用户切换和终端服务停止和禁用

本文关键字:服务 终端 解锁 会话 事件 Windows 用户 | 更新日期: 2023-09-27 18:02:20

我正在编写一个c# . net 3.5 Windows服务,它需要在用户登录或解锁事件发生时执行一些操作。我已经尝试通过将我的事件处理程序添加到Microsoft.Win32.SystemEvents.SessionSwitch:

来注册服务。
using Microsoft.Win32;
SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
    if (e.Reason == SessionSwitchReason.SessionLogon)
    { 
        //  Do Task
    }
    else if (e.Reason == SessionSwitchReason.SessionUnlock)
    { 
        //  Do Task
    }
}

我也试图覆盖ServiceBase类继承的OnSessionChange(SessionChangeDescription changeDescription) {...}方法:

protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
    if (changeDescription.Reason == SessionChangeReason.SessionLogon)
    {
        //  Do Task
    }
    else if (changeDescription.Reason == SessionChangeReason.SessionUnlock)
    {
        //  Do Task
    }
    base.OnSessionChange(changeDescription);
}

许多会话事件都是由上述方法处理的,不幸的是,当快速用户切换和终端服务被停止和禁用时,这些方法都不能处理会话解锁事件。但是,当两个服务都启用并运行时,将处理该事件。将在其上部署的工作环境将没有启用这些服务。

在c# .NET托管代码环境中是否有其他方法来完成此任务?我看到的许多问题用上面描述的方法回答了这个问题,它们确实工作正确,但当快速用户切换和终端服务都被禁用时,它们就不能正常工作了。

Windows服务:会话解锁事件与快速用户切换和终端服务停止和禁用

默认设置CanHandleSessionChangeEvent属性为False

初始化组件时插入以下代码

public Service1()
        {
            InitializeComponent();
            this.CanHandleSessionChangeEvent = true;
            this.CanHandlePowerEvent = true;
            this.CanPauseAndContinue = true;
            this.CanShutdown = true;
            this.CanStop = true;
            this.AutoLog = true;
        }

如果您在SessionSwitchReason中遇到困难,您可以在windows eventlog中启用'其他登录/注销事件'并自己监控这些事件。这有点混乱,因为您必须以某种方式轮询日志,但它确实有效。

参见- https://stackoverflow.com/a/40675839/6715034