我正在用C#编写Windows服务,该服务需要跟踪当前的 Activity 登录用户。为此,我重写了OnSessionChange事件,以记录用户何时登录,注销或锁定计算机。通常,在大多数情况下,这是可行的,但是有时服务会失去对 Activity 用户的跟踪。在我的日志文件中,我可以看到问题出在OnSessionChange方法上。每次调用此函数时,我都会输出一些日志信息,显然,OnSessionChange调用有时以错误的顺序进行。也就是说,如果用户锁定计算机然后又快速登录,则有时会发生两次OnSessionChange调用,从而导致以错误的顺序被调用(例如,首先是一个解锁事件,然后是一个锁定事件)。

有谁知道为什么会这样吗?有没有解决此问题的方法?

编辑:这是一些示例代码,以使其更加清晰(希望如此):

protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
    try
    {
        var user = _getUserName(changeDescription.SessionId);

        if (changeDescription.Reason == SessionChangeReason.SessionLock ||
            changeDescription.Reason == SessionChangeReason.SessionLogoff ||
            changeDescription.Reason == SessionChangeReason.ConsoleDisconnect)

            LogText(String.Format("{0} locked at {1}\r\n", user, DateTime.Now));

        else if (changeDescription.Reason == SessionChangeReason.SessionUnlock ||
                 changeDescription.Reason == SessionChangeReason.SessionLogon ||
                 changeDescription.Reason == SessionChangeReason.ConsoleConnect)

            LogText(String.Format("{0} unlocked at {1}\r\n", user, DateTime.Now));

        base.OnSessionChange(changeDescription);
    }
    catch (Exception e)
    {
        LogText("Exception: " + e);
    }
}

(未显示函数_getUserName和LogText,但是它们按照名称所提示的进行操作。此外,我从不获取异常,因此try-catch-block仅用于验证我实际上没有任何获取。)

现在,有时候,在我的日志中,我得到的是这样的:

UserA于18.01.2015 08:40:29解锁
UserA已于2015年1月18日解锁
UserA锁定于2015年1月18日08:44:28

这就是今天早上发生的事情。 UserA登录,然后锁定并立即(我认为)再次登录。但是最后两个事件以错误的顺序触发,因此在执行此顺序后,我的服务误认为UserA已消失。

通常,我会连续收到多个解锁事件,就像昨天这样:

UserA于17.01.2015 10:55:26解锁
UserA于17.01.2015 10:55:26解锁
UserA于17.01.2015 10:56:33解锁

或者我可以连续获取几个锁定事件,这可能意味着我在它们之间缺少一个或多个解锁事件:

UserA于17.01.2015 09:29:35解锁
UserA锁定在2015年1月17日10:25:28
UserA锁定在2015年1月17日10:30:20

最佳答案

this.CanHandleSessionChangeEvent必须设置为true,默认值为false。

09-26 04:02