在窗口中查询用户会话

本文关键字:用户 会话 查询 窗口 | 更新日期: 2023-09-27 18:34:32

有一个内置工具:query.exe允许您查看Windows中的所有活动用户和会话。

它的输出如下所示:

PS C:'> query.exe user
 USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
>testusr               console             1  Active      none   12/16/2014 9:29 AM

现在我有只解析query.exe输出的代码,但我们中的一些人担心未来的操作系统升级可能会改变查询的输出,所以我们正在寻找一个可以改用的 API 调用。

无论如何,有没有.Net方法来收集相同的信息?

对于替代方案,我们不需要所有字段,但我们确实需要:用户名、状态和登录时间。我们还需要从系统上下文运行此代码,以便任何需要用户上下文的代码或 WMI 类都不适用于我们。

在窗口中查询用户会话

好吧,我发现的,我认为可能对你有用的是决明子项目。

主页中几乎为您准备好了示例:

ITerminalServicesManager manager = new TerminalServicesManager();
using (ITerminalServer server = manager.GetLocalServer())
{
    server.Open();
    foreach (ITerminalServicesSession session in server.GetSessions())
    {
        Console.WriteLine("Hi there, " + session.UserAccount + " on session " + session.SessionId);
        Console.WriteLine("It looks like you logged on at " + session.LoginTime +
                          " and are now " + session.ConnectionState);
    }
}

正如你所看到的,当你得到一个终端服务会话时,你会发现用户名,登录时间和连接状态。

希望这对您有所帮助。

您可以使用 WMI 简单地获取上次登录时间:

using System;
using System.Management;
using System.Windows.Forms;
namespace WMISample
{
    public class MyWMIQuery
    {
        public static void Main()
        {
            try
            {
                ManagementObjectSearcher searcher = 
                    new ManagementObjectSearcher("root''CIMV2", 
                    "SELECT * FROM Win32_LogonSession"); 
                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Win32_LogonSession instance");
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Last Logon: {0}", queryObj["StartTime"]);
                }
            }
            catch (ManagementException e)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}

听起来你想要NetWkstaUserEnum .我找不到本机 .NET 版本,但它似乎是一个相当轻的互操作调用。