Recibe notificaciones de inicio y cierre de sesión
Tengo que desarrollar un programa que se ejecute en una PC local como servicio y entregue un par de estados de usuario a un servidor. Al principio tengo que detectar al usuario.inicio de sesión ydesconectarse.
Mi idea fue usar elManagementEventWatcher
clase y para consultar laWin32_LogonSession
Ser notificado si algo ha cambiado.
Mi primera prueba funciona bien, aquí está la parte del código(Esto se ejecutaría como un hilo de un servicio):
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);
}
}
Pero tengo algunos problemas de comprensión y no estoy seguro de si esta es la forma común de resolver esa tarea.
Si preguntoWin32_LogonSession
Obtengo varios registros que están asociados al mismo usuario. Por ejemplo, obtengo estos ID 7580798 y 7580829 y si pregunto
ASOCIADORES DE {Win32_LogonSession.LogonId = X} DONDE ResultClass = Win32_UserAccount
Obtengo el mismo registro para diferentes identificaciones. (Win32_UserAccount.Domain = "PC-Name", Name = "User1")
¿Por qué hay varias sesiones de inicio de sesión con el mismo usuario? ¿Cuál es la forma común de obtener el usuario registrado actual? O mejor, ¿cómo recibir una notificación correcta por el inicio de sesión de un usuario?
Pensé que podría usar de la misma manera con__InstanceDeletionEvent
para determinar si un usuario está desconectado. Pero supongo que si se levanta el evento, no puedo consultarWin32_UserAccount
para el nombre de usuario después de eso. ¿Estoy en lo cierto?
Estoy en la dirección correcta o hay mejores maneras? ¡Sería genial si pudieras ayudarme!
Editar ¿Es la clase WTSRegisterSessionNotification la forma correcta? No sé si es posible, porque en un servicio no tengo un manejador de ventanas.