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

Zah*_*aka 14 .net c# windows-services

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

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

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

flo*_*din 16

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


Dan*_*rts 6

另一种选择,如果你不想处理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;
}
Run Code Online (Sandbox Code Playgroud)


lib*_*jup 6

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

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