在 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);
}
因此,我不得不在 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);
}