Windows .NET 服务 - OnSessionChange 事件似乎相当不可靠

问题描述 投票:0回答:1

我正在用 C# 编写一个 Windows 服务,它需要跟踪当前活动的登录用户。为此,我重写了

OnSessionChange
事件,以便记录用户何时登录、注销或锁定计算机。这通常在大多数情况下都有效,但有时该服务会失去对活动用户的跟踪。在我的日志文件中,我可以看到问题出在
OnSessionChange
方法上。每次调用此函数时,我都会输出一些日志信息,显然,
OnSessionChange
调用有时会以错误的顺序出现。也就是说,如果用户锁定计算机然后再次快速登录,有时会发生两个
OnSessionChange
调用,这会导致 get 调用顺序错误(例如,首先是解锁事件,然后是锁定事件)。

有谁知道为什么会发生这种情况?这个问题有什么解决办法吗?

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

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
块只是为了验证我实际上没有遇到任何异常。

现在,有时,在我的日志中我会得到这样的信息:

用户A于2015年1月18日08:40:29解锁
用户A于2015年1月18日08:44:28解锁
用户A 锁定于 18.01.2015 08:44:28

这就是今天早上发生的事情。

UserA
登录,然后锁定并立即(我认为)再次登录。但是最后两个事件以错误的顺序触发,因此在这个序列之后,我的服务错误地认为
UserA
消失了。

我经常会连续收到几个解锁事件,就像昨天的这个:

用户A于2015年1月17日10:55:26解锁
用户A于2015年1月17日10:55:26解锁
用户A于2015年1月17日10:56:33解锁

或者,我可以连续获得多个锁定事件,这可能意味着我在它们之间丢失了一个或多个解锁事件:

用户A于2015年1月17日09:29:35解锁
用户A 锁定于 17.01.2015 10:25:28
UserA 锁定于 17.01.2015 10:30:20
c# windows service authentication
1个回答
-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.