Получать уведомления от входа и выхода

Я должен разработать программу, которая работает на локальном компьютере в качестве службы доставки нескольких пользовательских статусов на сервер. В начале я должен обнаружить пользователявход в систему а такжевыйти.

Моя идея состояла в том, чтобы использоватьManagementEventWatcher класс и запроситьWin32_LogonSession получать уведомления, если что-то изменилось.

Мой первый тест работает хорошо, вот часть кода(Это будет выполнено как поток из службы):

private readonly static WqlEventQuery qLgi = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance ISA \"Win32_LogonSession\"");

public EventWatcherUser() {
}

public void DoWork() {
    ManagementEventWatcher eLgiWatcher = new ManagementEventWatcher(EventWatcherUser.qLgi);
    eLgiWatcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
    eLgiWatcher.Start();
}

private void HandleEvent(object sender, EventArrivedEventArgs e)
{
    ManagementBaseObject f = (ManagementBaseObject)e.NewEvent["TargetInstance"];
    using (StreamWriter fs = new StreamWriter("C:\\status.log", true))
    {
        fs.WriteLine(f.Properties["LogonId"].Value);
    }
}

Но у меня есть некоторые проблемы с пониманием, и я не уверен, является ли это обычным способом решения этой задачи.

Если я сделаю запросWin32_LogonSession Я получаю несколько записей, которые связаны с одним и тем же пользователем. Например, я получаю эти идентификаторы 7580798 и 7580829, и если я запрашиваю

ASSOCIATORS OF {Win32_LogonSession.LogonId = X} WHERE ResultClass = Win32_UserAccount

Я получаю одну и ту же запись для разных идентификаторов. (Win32_UserAccount.Domain = "PC-Name", Name = "User1")

Почему несколько сеансов входа в систему с одним и тем же пользователем? Каков обычный способ получить текущего зарегистрированного пользователя? Или лучше, как правильно получать уведомления по логину пользователя?

Я думал, что могу использовать то же самое с__InstanceDeletionEvent чтобы определить, вышел ли пользователь из системы. Но я думаю, что если событие поднято, я не могу запроситьWin32_UserAccount для имени пользователя после этого. Я прав?

Я в правильном направлении или есть лучшие способы? Было бы здорово, если бы вы могли мне помочь!

редактировать Является ли класс WTSRegisterSessionNotification правильным способом? Я не знаю, возможно ли это, потому что в сервисе у меня нет обработчика окна.

Ответы на вопрос(4)

Ваш ответ на вопрос