在 C# 中查询 QWINSTA

Query QWINSTA in C#

因此,我不得不在 C# 中检测路由,为此我使用了以下代码。

        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_IP4RouteTable");

        foreach (ManagementObject queryObj in searcher.Get())
        {
            string destination = queryObj["Destination"].ToString();
            string mask = queryObj["Mask"].ToString();
            string metric = queryObj["Metric1"].ToString();
            string interfaceIndex = queryObj["InterfaceIndex"].ToString();
            string nexthop = queryObj["NextHop"].ToString();
            ...
        }

现在我不想注销远程桌面会话。我知道我可以使用 qwinsta 命令执行此操作,但我想知道是否有某种方法可以将 qwinsta 的结果导入 C#,就像上面的 netstat 解决方案一样。

我发现您可以使用 Cassia 库检索特定服务器的会话 ID

        ITerminalServicesManager manager = new TerminalServicesManager();
        using (ITerminalServer server = manager.GetRemoteServer(serverName))
        {
            server.Open();
            foreach (ITerminalServicesSession session in server.GetSessions())
            {
                 NTAccount account = session.UserAccount;
                if (account != null)
                {
                    if (account.ToString() == username)
                    {
                        Disconnect(serverName, session.SessionId);
                    }
                }
            }
        }

使用上面的代码,您可以提取断开连接所需的信息。必须如何断开连接对我来说仍然是一个谜,因为当我通过 C# 调用注销命令时,我得到一个错误。


* 编辑 *

对于那些感兴趣的人,我已经找到了通过代码从远程服务器注销而不使用 logoff.exe

的方法
    [DllImport("wtsapi32.dll", SetLastError = true)]
    static extern bool WTSLogoffSession(IntPtr hServer, int SessionId, bool bWait);
    [DllImport("wtsapi32.dll", SetLastError = true)]
    static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);

    private void Disconnect(string serverName, int sessionId)
    {
        IntPtr server = WTSOpenServer(serverName);
        WTSLogoffSession(server, sessionId, false);
    }