Служба Windows .NET – событие OnSessionChange кажется весьма ненадежнымC#

Место общения программистов C#
Anonymous
Служба Windows .NET – событие OnSessionChange кажется весьма ненадежным

Сообщение Anonymous »

Я пишу службу Windows на C#, которая должна отслеживать текущего активного вошедшего в систему пользователя. Для этого я переопределил событие OnSessionChange, чтобы отмечать, когда пользователи входят в систему, выходят из системы или блокируют компьютер. Обычно это работает в большинстве случаев, однако иногда служба теряет связь с активным пользователем. В моих файлах журналов я вижу, что проблема заключается в методе 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 нужен только для того, чтобы убедиться, что я на самом деле их не получаю.
Иногда в моем журнале я получайте такие вещи:

Пользователь A разблокирован 18.01.2015 08:40:29
Пользователь A разблокирован 18.01.2015 08:44:28
Пользователь А заблокирован 18.01.2015 08:44:28

Вот что произошло сегодня утром. ПользовательA вошел в систему, затем заблокировался и сразу (я думаю) вошел снова. Но два последних события были запущены в неправильном порядке, поэтому после этой последовательности моя служба ошибочно подумала, что UserA исчез.
Часто я получаю несколько событий разблокировки в одном строка, как эта вчерашняя:

Пользователь А разблокирован 17.01.2015 10:55:26
Пользователь А разблокирован 17.01.2015 10:55:26UserA разблокирован 17.01.2015 10:56:33

Или я могу получить несколько событий блокировки подряд, что, вероятно, означает, что я пропал одно или несколько событий разблокировки между ними:

Пользователь A разблокирован 17.01.2015 09:29:35
Пользователь A заблокирован 17.01.2015 10:25: 28
Пользователь A заблокирован 17.01.2015 10:30:20


Подробнее здесь: https://stackoverflow.com/questions/280 ... unreliable

Вернуться в «C#»