2009-02-15 50 views
13

我正在編寫一個Windows服務應用程序,該應用程序監聽連接並根據網絡上另一臺計算機上運行的其他應用程序的指示執行某些任務。檢查當前是否有用戶登錄到Windows

其中一項任務確保當前沒有用戶登錄,鎖定工作站,刪除某些文件,然後重新啓動系統。我考慮使用this solution來查看正在運行的進程列表並檢查用戶名,通過將用戶名與SYSTEM,NETWORK等匹配來確定是否沒有用戶登錄。我意識到我有PostgreSQL正在運行,它使用名爲postgres的用戶帳戶所以這是行不通的。檢查explorer.exe是否運行也不起作用,因爲資源管理器崩潰,或者我有時自己結束這個過程並重新啓動它。

什麼是確定沒有用戶使用C#登錄到工作站的好方法?

+1

非常感謝大家。我並不擅長使用WMI,在發生錯誤後發生錯誤後,決定採用flodin的答案。以下是其他人感興趣的示例用法:http://www.pinvoke.net/default.aspx/wtsapi32/WTSEnumerateSessions.html – Zahymaka 2009-02-15 21:37:48

回答

2

你可以使用WMI

select UserName from Win32_ComputerSystem 
+0

如果有人對此進行了低票,請提供解釋原因。答案錯了嗎?還是有更好的方法來做到這一點? – DOK 2009-02-15 19:33:39

+0

但是,我不喜歡這個答案,而不是降級投票。 – unixman83 2011-09-16 22:43:35

4

另一種選擇是,如果您不想處理P/Invokes:請使用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; 
} 
2

您試圖檢查explorer.exe是否正在運行。 爲什麼不去winlogon.exe過程?

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