2

我正在编写一个 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
    }
}

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

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 托管代码环境中是否有另一种方法可以实现这一点?我看到的许多问题都使用上述方法回答了这个问题,它们确实可以正常工作,但在禁用快速用户切换和终端服务时不能正常工作。

4

2 回答 2

0

CanHandleSessionChangeEvent属性False默认设置为。

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

public Service1()
        {
            InitializeComponent();
            this.CanHandleSessionChangeEvent = true;
            this.CanHandlePowerEvent = true;
            this.CanPauseAndContinue = true;
            this.CanShutdown = true;
            this.CanStop = true;
            this.AutoLog = true;
        }
于 2012-02-03T13:34:16.250 回答
0

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

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

于 2016-11-18T11:29:09.730 回答