Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查当前是否没有用户登录到Windows_C#_.net_Windows Services - Fatal编程技术网

C# 检查当前是否没有用户登录到Windows

C# 检查当前是否没有用户登录到Windows,c#,.net,windows-services,C#,.net,Windows Services,我正在编写一个Windows服务应用程序,它侦听连接,并按照网络上另一台计算机上运行的不同应用程序的指示执行某些任务 其中一项任务是确保当前没有用户登录,锁定工作站,删除一些文件,然后重新启动系统。我考虑使用查看正在运行的进程列表并检查用户名,通过将用户名与系统、网络等进行匹配来确定是否没有用户登录。我意识到我运行的PostgreSQL使用了一个名为postgres的用户帐户,因此无法工作。检查explorer.exe是否正在运行也不起作用,因为explorer sometmes崩溃,或者我有时

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

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

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

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

您可以使用WMI

select UserName from Win32_ComputerSystem

CodeProject文章“”可能就是您要查找的内容。代码枚举用户,并可以识别哪些用户(如果有的话)是交互式的(即哪些用户是真人)。

如果您不想处理p/Invokes,另一个选项是:使用


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

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

如果有人投了反对票,请解释原因。答案错了吗?或者有更好的方法可以做到这一点吗?我不喜欢这个答案,但不喜欢向下投票。WMI在周期方面很昂贵,速度也很慢,但对于一次性查询来说,这不是问题。如果您在循环中使用WMI,它的成本很高,而且您会看到像wmiprvse.exe这样的东西占用CPU周期,这对每个人都有很大影响。我不太擅长使用WMI,在遇到一个又一个错误后,我决定采用flodin的答案。这里有一个供其他感兴趣的人使用的示例:在此上下文中,什么是
server
public bool isLoggedOn()
{
    Process[] pname = Process.GetProcessesByName("winlogon");
    if (pname.Length == 0)
        return false;
    else
        return true;
}