检查当前没有用户登录到Windows

我正在编写一个Windows服务应用程序,它根据在网络上另一台计算机上运行的不同应用程序的指示来侦听连接并执行某些任务。

其中一项任务确保当前没有用户登录,锁定工作站,删除一些文件,然后重新启动系统。 我考虑使用此解决方案查看正在运行的进程列表并检查用户名,通过将用户名与SYSTEM,NETWORK等进行匹配来确定是否没有用户登录。我意识到我运行的PostgreSQL使用了一个名为的用户帐户postgres所以不行。 检查explorer.exe是否正在运行也不起作用,因为explorer sometmes崩溃,或者我有时会自行结束该进程并重新启动它。

确定NO用户使用C#登录到工作站的好方法是什么?

使用WTSGetActiveConsoleSessionId()确定是否有人在本地登录。 使用WTSEnumerateSessions()来确定是否存在任何会话(包括远程终端服务会话)。

另一种选择,如果你不想处理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; } 

CodeProject文章“ 使用本地安全机构在.NET中枚举用户会话 ”可能正是您所寻找的。 该代码枚举用户并且可以识别哪些用户(如果有的话)是交互式的(即,哪些用户是真人)。

你可以使用WMI

 select UserName from Win32_ComputerSystem 

您试图检查explorer.exe是否正在运行。 为什么不去winlogon.exe进程?

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