- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试通过 C# 以编程方式检索一些 RDC/RDP 和“控制台”登录信息。
我想开发一个简单的控制台应用程序 (.EXE),以便我可以从我们域中任何远程计算机(Windows Server 2003 x86 或 2008R2 x64)的任务管理器 -> 用户选项卡中检索信息。
这显示一个人是直接登录到服务器(即控制台)还是通过 RDC/RDP(包括客户端,如果它仍然处于事件状态)或断开连接,如果它是“暂停”(即他们没有注销但只是暂时关闭了 RDC/RDP 窗口)
我拥有所有服务器的管理员权限,可以配置任何需要启用/禁用的 Windows 服务/防火墙规则(如果需要)
我想我可能必须使用 WMI(使用 System.Management),但我从谷歌找到的示例只检索现有用户。
//Method 1
var searcher = new ManagementObjectSearcher(
"SELECT UserName FROM Win32_ComputerSystem");
var collection = Searcher.Get();
foreach(ManagementObject entry in collection)
{
Console.WriteLine(entry["UserName"]);
}
//Method 2
string computer = "somecomputername";
var searcher = new ManagementObjectSearcher(
computer + @"root\CIMV2", "SELECT * FROM Win32_TerminalService");
var collection = Searcher.Get();
foreach(ManagementObject entry in collection)
{
//Write them out (although usernames isnt listed from the example I found)
}
最佳答案
这将为您提供所需的一切。只需调用 ListSessions
并传入服务器名称即可。要获取其他 session 信息,请将 ServerName
和 SessionId
传递给 GetSessionInfo
。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace TerminalTools
{
public class TermServicesManager
{
[DllImport("wtsapi32.dll")]
static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);
[DllImport("wtsapi32.dll")]
static extern void WTSCloseServer(IntPtr hServer);
[DllImport("Wtsapi32.dll")]
public static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass,
out System.IntPtr ppBuffer, out uint pBytesReturned);
[DllImport("wtsapi32.dll")]
static extern Int32 WTSEnumerateSessions(IntPtr hServer, [MarshalAs(UnmanagedType.U4)] Int32 Reserved,
[MarshalAs(UnmanagedType.U4)] Int32 Version, ref IntPtr ppSessionInfo, [MarshalAs(UnmanagedType.U4)] ref Int32 pCount);
[DllImport("wtsapi32.dll")]
static extern void WTSFreeMemory(IntPtr pMemory);
[StructLayout(LayoutKind.Sequential)]
private struct WTS_SESSION_INFO
{
public Int32 SessionID;
[MarshalAs(UnmanagedType.LPStr)]
public String pWinStationName;
public WTS_CONNECTSTATE_CLASS State;
}
[StructLayout(LayoutKind.Sequential)]
public struct WTS_CLIENT_ADDRESS
{
public uint AddressFamily;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] Address;
}
[StructLayout(LayoutKind.Sequential)]
public struct WTS_CLIENT_DISPLAY
{
public uint HorizontalResolution;
public uint VerticalResolution;
public uint ColorDepth;
}
public enum WTS_CONNECTSTATE_CLASS
{
Active,
Connected,
ConnectQuery,
Shadow,
Disconnected,
Idle,
Listen,
Reset,
Down,
Init
}
public enum WTS_INFO_CLASS
{
InitialProgram = 0,
ApplicationName = 1,
WorkingDirectory = 2,
OEMId = 3,
SessionId = 4,
UserName = 5,
WinStationName = 6,
DomainName = 7,
ConnectState = 8,
ClientBuildNumber = 9,
ClientName = 10,
ClientDirectory = 11,
ClientProductId = 12,
ClientHardwareId = 13,
ClientAddress = 14,
ClientDisplay = 15,
ClientProtocolType = 16
}
private static IntPtr OpenServer(string Name)
{
IntPtr server = WTSOpenServer(Name);
return server;
}
private static void CloseServer(IntPtr ServerHandle)
{
WTSCloseServer(ServerHandle);
}
public static List<TerminalSessionData> ListSessions(string ServerName)
{
IntPtr server = IntPtr.Zero;
List<TerminalSessionData> ret = new List<TerminalSessionData>();
server = OpenServer(ServerName);
try
{
IntPtr ppSessionInfo = IntPtr.Zero;
Int32 count = 0;
Int32 retval = WTSEnumerateSessions(server, 0, 1, ref ppSessionInfo, ref count);
Int32 dataSize = Marshal.SizeOf(typeof(WTS_SESSION_INFO));
Int64 current = (int)ppSessionInfo;
if (retval != 0)
{
for (int i = 0; i < count; i++)
{
WTS_SESSION_INFO si = (WTS_SESSION_INFO)Marshal.PtrToStructure((System.IntPtr)current, typeof(WTS_SESSION_INFO));
current += dataSize;
ret.Add(new TerminalSessionData(si.SessionID, si.State, si.pWinStationName));
}
WTSFreeMemory(ppSessionInfo);
}
}
finally
{
CloseServer(server);
}
return ret;
}
public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionId)
{
IntPtr server = IntPtr.Zero;
server = OpenServer(ServerName);
System.IntPtr buffer = IntPtr.Zero;
uint bytesReturned;
TerminalSessionInfo data = new TerminalSessionInfo();
try
{
bool worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.ApplicationName, out buffer, out bytesReturned);
if (!worked)
return data;
string strData = Marshal.PtrToStringAnsi(buffer);
data.ApplicationName = strData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.ClientAddress, out buffer, out bytesReturned);
if (!worked)
return data;
WTS_CLIENT_ADDRESS si = (WTS_CLIENT_ADDRESS)Marshal.PtrToStructure((System.IntPtr)buffer, typeof(WTS_CLIENT_ADDRESS));
data.ClientAddress = si;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.ClientBuildNumber, out buffer, out bytesReturned);
if (!worked)
return data;
int lData = Marshal.ReadInt32(buffer);
data.ClientBuildNumber = lData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.ClientDirectory, out buffer, out bytesReturned);
if (!worked)
return data;
strData = Marshal.PtrToStringAnsi(buffer);
data.ClientDirectory = strData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.ClientDisplay, out buffer, out bytesReturned);
if (!worked)
return data;
WTS_CLIENT_DISPLAY cd = (WTS_CLIENT_DISPLAY)Marshal.PtrToStructure((System.IntPtr)buffer, typeof(WTS_CLIENT_DISPLAY));
data.ClientDisplay = cd;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.ClientHardwareId, out buffer, out bytesReturned);
if (!worked)
return data;
lData = Marshal.ReadInt32(buffer);
data.ClientHardwareId = lData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.ClientName, out buffer, out bytesReturned);
strData = Marshal.PtrToStringAnsi(buffer);
data.ClientName = strData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.ClientProductId, out buffer, out bytesReturned);
Int16 intData = Marshal.ReadInt16(buffer);
data.ClientProductId = intData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.ClientProtocolType, out buffer, out bytesReturned);
intData = Marshal.ReadInt16(buffer);
data.ClientProtocolType = intData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.ConnectState, out buffer, out bytesReturned);
lData = Marshal.ReadInt32(buffer);
data.ConnectState = (WTS_CONNECTSTATE_CLASS)Enum.ToObject(typeof(WTS_CONNECTSTATE_CLASS), lData);
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.DomainName, out buffer, out bytesReturned);
strData = Marshal.PtrToStringAnsi(buffer);
data.DomainName = strData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.InitialProgram, out buffer, out bytesReturned);
strData = Marshal.PtrToStringAnsi(buffer);
data.InitialProgram = strData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.OEMId, out buffer, out bytesReturned);
strData = Marshal.PtrToStringAnsi(buffer);
data.OEMId = strData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.SessionId, out buffer, out bytesReturned);
lData = Marshal.ReadInt32(buffer);
data.SessionId = lData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.UserName, out buffer, out bytesReturned);
strData = Marshal.PtrToStringAnsi(buffer);
data.UserName = strData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.WinStationName, out buffer, out bytesReturned);
strData = Marshal.PtrToStringAnsi(buffer);
data.WinStationName = strData;
worked = WTSQuerySessionInformation(server, SessionId,
WTS_INFO_CLASS.WorkingDirectory, out buffer, out bytesReturned);
strData = Marshal.PtrToStringAnsi(buffer);
data.WorkingDirectory = strData;
}
finally
{
WTSFreeMemory(buffer);
buffer = IntPtr.Zero;
CloseServer(server);
}
return data;
}
}
public class TerminalSessionData
{
public int SessionId;
public TermServicesManager.WTS_CONNECTSTATE_CLASS ConnectionState;
public string StationName;
public TerminalSessionData(int sessionId, TermServicesManager.WTS_CONNECTSTATE_CLASS connState, string stationName)
{
SessionId = sessionId;
ConnectionState = connState;
StationName = stationName;
}
public override string ToString()
{
return String.Format("{0} {1} {2}", SessionId, ConnectionState, StationName);
}
}
public class TerminalSessionInfo
{
public string InitialProgram;
public string ApplicationName;
public string WorkingDirectory;
public string OEMId;
public int SessionId;
public string UserName;
public string WinStationName;
public string DomainName;
public TermServicesManager.WTS_CONNECTSTATE_CLASS ConnectState;
public int ClientBuildNumber;
public string ClientName;
public string ClientDirectory;
public int ClientProductId;
public int ClientHardwareId;
public TermServicesManager.WTS_CLIENT_ADDRESS ClientAddress;
public TermServicesManager.WTS_CLIENT_DISPLAY ClientDisplay;
public int ClientProtocolType;
}
}
关于C#获取RDC/RDP和 "Console"Session信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13987213/
RDP 客户端是否可以启动远程应用程序,然后仅显示该应用程序(而不是桌面)?应用程序将在客户端中全屏显示,如果应用程序关闭, session 将结束。 最佳答案 “备用外壳”doesn't seem
我希望能够在远程机器上运行应用程序时访问某些特定于设备的数据。问题是,如果 RDP 窗口最小化,则此数据不可用。我正在研究的一种解决方案是编写我自己的 RDP 客户端,以便服务器机器始终认为它具有事件
我看过多篇文章讨论如何通过 Visual Studio 配置 RDP 设置、通过 RDP 程序进行凭据缓存,但我们仍然遇到问题。 我还看到过文章说“您需要为 RDP 角色添加端点”——如果我这样做,V
当我通过以下方式登录时,尝试从 RAWMOUSE 结构的 lLastX 和 lLastY 成员更新鼠标位置时RDP,我得到了一些非常奇怪的数字(例如两者都> 30,000)。我在 Windows 7、
我正在 Lync-2013 中进行应用程序共享。我的 ICE-Check 成功完成,并收到重新邀请响应的 ACK,但大约 35-40 秒后,连接终止,收到一条 BYE 消息,指示原因“由于 RDP 堆
我必须更改管理员密码,因为它已通过 RDP 过期。更改后服务器工作正常。 后来我断开了 session ,然后再次启动它,现在我们收到以下错误消息: An authentication error h
我正在尝试从我的网页打开到服务器的 rdp session 。 testrdp .bat 文件中仅包含以下行: mstsc/v:emea-cirrus 发生的事情是该文件只是作为文本文件显示在我的 c
我配置了 P2S VPN,并且能够通过私有(private) IP 地址访问 Hub 虚拟网络中的 Jump-box。 使用相同的 P2S VPN,我无法访问生产订阅中的虚拟机,但我可以直接从 Jum
在我当前工作中正在从事的项目中,我们需要在 azure Web 角色上启用 RDP。我已启用 RDP,但客户端无法连接。我们确认 RDP 端口也已打开。 客户不需要在他/她的机器上安装证书吗? 最佳答
我在 Azure(Windows 10 专业版)上有一个小型服务器。该服务器上只有一项服务(Web 服务 REST),这并不重要:如果该服务关闭几个小时甚至几天,或者有人窃取了数据,也没什么大不了的。
Windows Azure、用于 Web/辅助角色的 RDP 配置成功。一切正常,我可以通过 RDP 连接到服务器。我可以看到登录屏幕、桌面等。但 3..10 秒后一切都卡住了。好像断线了重新连接后一
如何检测远程客户端是否正在运行远程桌面协议(protocol)?它也接受远程桌面连接?? 比如打开一个端口来检测 HTTP 并发送请求、接收请求 header 并在请求 header 中查看有关 HT
Windows Azure、用于 Web/辅助角色的 RDP 配置成功。一切正常,我可以通过 RDP 连接到服务器。我可以看到登录屏幕、桌面等。但 3..10 秒后一切都卡住了。好像断线了重新连接后一
正如主题所说,我尝试在delphi中使用此代码连接到服务器 procedure TmainF.Button1Click(Sender: TObject); var rdp1 : TMsRdpCl
如何检测远程客户端是否正在运行远程桌面协议(protocol)?它也接受远程桌面连接?? 比如打开一个端口来检测 HTTP 并发送请求、接收请求 header 并在请求 header 中查看有关 HT
这是一个研发项目。通过蓝牙将 Windows PC 的桌面传输到手机。我成功地将桌面以 720p 流式传输到我的 Android 手机,但问题是我无法进行直播。通过蓝牙传输的编码和数据需要几毫秒,所以
我想编写一个可以将文件从服务器发送到客户端的应用程序: 使用 Windows 远程桌面从客户端登录服务器。 服务器上的应用程序可以反向连接到客户端,并使用与远程桌面相同的端口向客户端发送多个文件。 客
github issue: VS Code "and still" won't open in a Linux xrdp session Workaround- Linux RDP 会话中无法打开VS
提到远程管理,通常指的是远程管理服务器,而非个人计算机。个人计算机可以随时拿来用,服务器通常放置在机房中,用户无法直接接触到服务器硬件,只能采用远程管理的方式。 远程管理,实际上就是计算机(服务器)之
我的经理向我指出了我们的一个会计应用程序可以做的一些漂亮的事情,因为当在 RDP session 中打开包时,它可以根据主机的机器名称和客户端的机器名称加载不同的设置。 我们希望在我公司的一个应用程序
我是一名优秀的程序员,十分优秀!