2009-02-15 10 views
13

Piszę aplikację usługi systemu Windows, która nasłuchuje połączeń i wykonuje określone zadania zgodnie z instrukcją z innej aplikacji uruchomionej na innym komputerze w sieci.Sprawdź, czy żaden użytkownik nie jest aktualnie zalogowany do systemu Windows

Jedno z zadań zapewnia, że ​​żaden użytkownik nie jest aktualnie zalogowany, blokuje stację roboczą, usuwa niektóre pliki, a następnie ponownie uruchamia system. Rozważałem użycie this solution do przejrzenia listy uruchomionych procesów i sprawdzenia nazw użytkowników, ustalenie, czy żaden użytkownik nie jest zalogowany przez dopasowywanie nazw użytkowników do SYSTEMU, SIECI itp. Zdałem sobie sprawę, że mam działające PostgreSQL, które używa konta użytkownika o nazwie postgres więc to by nie działało. Sprawdzanie, czy działa program explorer.exe, również nie działa, ponieważ program explorer czasem się zawiesza lub czasami kończę proces i ponownie go uruchamiam.

Jaki byłby dobry sposób określenia, że ​​NO użytkownik jest zalogowany na stacji roboczej przy użyciu C#?

+1

Wielkie dzięki wszystkim. Nie jestem zbyt dobry w korzystaniu z WMI i po trafieniu błędu po błędzie, zdecydowałem się na odpowiedź flodin. Oto przykład użycia dla każdego zainteresowanego: http://www.pinvoke.net/default.aspx/wtsapi32/WTSEnumerateSessions.html – Zahymaka

Odpowiedz

2

Można użyć WMI

select UserName from Win32_ComputerSystem 
+0

Jeśli ktoś zagłosuje na to, proszę podać wyjaśnienie, dlaczego. Czy odpowiedź jest błędna? Czy są po prostu lepsze sposoby, aby to zrobić? – DOK

+0

Nie podoba mi się ta odpowiedź, a nie głosowanie w dół. – unixman83

4

Inną opcją, jeśli nie chcesz zajmować się P/Invokes: użyj 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

To jest świetna odpowiedź dla C#! To powinno zostać przegłosowane. – unixman83

2

Próbowano sprawdzić, czy działa explorer.exe, czy nie. Dlaczego nie przejść do procesu winlogon.exe?

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