Мне нужно разработать программу, которая работает на локальном компьютере как услуга, доставляющая пару статуса пользователя на сервер. Вначале я должен обнаружить пользователя logon и выйти.
Моя идея состояла в том, чтобы использовать класс 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
, я получаю несколько записей, которые связанных с одним и тем же пользователем. Например, я получаю эти ID 7580798 и 7580829, и если я запрошуАССОЦИАТОРЫ {Win32_LogonSession.LogonId = X} WHERE Resultclass= Win32_UserAccount
Я получаю одну и ту же запись для разных идентификаторов. (Win32_UserAccount.Domain = "PC-Name", Name= "User1" )
Почему существует несколько сеансов входа в систему с одним и тем же пользователем? Что это общий способ получить текущий подписанный пользователь? Или лучше, как получить уведомление правильно по логину пользователя?
-
Я думал, что могу использовать то же самое с
__InstanceDeletionEvent
, чтобы определить, отключен ли пользователь. Но я думаю, что если событие будет поднято, я cant queryWin32_UserAccount
для имени пользователя после этого. Im правильно?
Im в правильном направлении или есть лучшие способы? Было бы здорово, если бы вы могли мне помочь!
Изменить Является ли класс WTSRegisterSessionNotification правильным? Я не знаю, возможно ли это, потому что в службе у меня нет обработчика окна.