Seja notificado de logon e logoff
Eu tenho que desenvolver um programa que executa em um PC local como um serviço e entregar um par de status de usuário para um servidor. No começo eu tenho que detectar o usuáriologon esair.
Minha ideia era usar oManagementEventWatcher
classe e para consultar oWin32_LogonSession
para ser notificado se algo mudou.
Meu primeiro teste funciona bem, aqui está a parte do código(Isso seria executado como um segmento de um serviço):
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);
}
}
Mas tenho alguns problemas de compreensão e não tenho certeza se essa é a maneira comum de resolver essa tarefa.
Se eu consultarWin32_LogonSession
Eu recebo vários registros que estão associados ao mesmo usuário. Por exemplo eu recebo este IDs 7580798 e 7580829 e se eu consultar
ASSOCIADORES DE {Win32_LogonSession.LogonId = X} WHERE ResultClass = Win32_UserAccount
Eu recebo o mesmo registro para IDs diferentes. (Win32_UserAccount.Domain = "PC-Name", Name = "User1")
Por que existem várias sessões de logon com o mesmo usuário? Qual é a maneira comum de obter o atual usuário conectado? Ou melhor como ser notificado corretamente pelo login de um usuário?
Eu pensei que eu poderia usar da mesma maneira com__InstanceDeletionEvent
para determinar se um usuário está logoff. Mas eu acho que se o evento for gerado, eu não posso consultarWin32_UserAccount
para o nome de usuário depois disso. Eu estou certo?
Eu estou na direção certa ou existem maneiras melhores? Seria ótimo se você pudesse me ajudar!
Editar A classe WTSRegisterSessionNotification é a maneira correta? Eu não sei se é possível, porque em um serviço eu não tenho um manipulador de janela.