Получать уведомления от входа и выхода
Я должен разработать программу, которая работает на локальном компьютере в качестве службы доставки нескольких пользовательских статусов на сервер. В начале я должен обнаружить пользователявход в систему а такжевыйти.
Моя идея состояла в том, чтобы использовать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 правильным способом? Я не знаю, возможно ли это, потому что в сервисе у меня нет обработчика окна.