2009-02-15 11 views
13

Estoy escribiendo una aplicación de servicio de Windows que escucha las conexiones y realiza ciertas tareas como se indica desde una aplicación diferente que se ejecuta en otra computadora en la red.Compruebe si ningún usuario está actualmente conectado a Windows

Una de las tareas asegura que ningún usuario está actualmente conectado, bloquea la estación de trabajo, borra algunos archivos y luego reinicia el sistema. Consideré usar this solution para examinar la lista de procesos en ejecución y verificar los nombres de usuario, determinando si ningún usuario está conectado al coincidir los nombres de usuario con SISTEMA, RED, etc. Me di cuenta que tengo PostgreSQL ejecutándose que usa una cuenta de usuario llamada postgres entonces eso no funcionaria Comprobar si explorer.exe se está ejecutando tampoco funcionaría porque el explorador falla, o a veces finalizo el proceso yo mismo y lo reinicio.

¿Cuál sería una buena forma de determinar que ningún usuario ha iniciado sesión en una estación de trabajo usando C#?

+1

Muchas gracias a todos. No soy muy bueno en el uso de WMI y después de golpear el error después de error, decidí ir por la respuesta de Flodin. Aquí hay un ejemplo de uso para cualquier otra persona interesada: http://www.pinvoke.net/default.aspx/wtsapi32/WTSEnumerateSessions.html – Zahymaka

Respuesta

2

Se podría utilizar WMI

select UserName from Win32_ComputerSystem 
+0

Si alguien lo rechaza, proporcione una explicación de por qué. Es la respuesta incorrecta? ¿O hay mejores formas de hacer esto? – DOK

+0

No me gusta esta respuesta, no la votación a la baja, sin embargo. – unixman83

4

Otra opción, si no desea tratar con los P/Invocaciones: use Cassia.

using Cassia; 

public static bool IsSomeoneLoggedOn(string server) 
{ 
    foreach (ITerminalServicesSession session in new TerminalServicesManager().GetSessions(server)) 
    { 
     if (!string.IsNullOrEmpty(session.UserName)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+0

¡Esta es una gran respuesta para C#! Esto debe ser votado. – unixman83

2

Ha intentado verificar si explorer.exe está funcionando o no. ¿Por qué no opta por el proceso winlogon.exe?

public bool isLoggedOn() 
{ 
    Process[] pname = Process.GetProcessesByName("winlogon"); 
    if (pname.Length == 0) 
     return false; 
    else 
     return true; 
} 
Cuestiones relacionadas