c# - 在远程会话中查找物理机的 IP 地址
问题描述
我查看了stackoverflow,但它所描述的只是在远程工作时如何获取远程IP地址。这可以通过以下方式完成:
var ipHostEntry = Dns.GetHostEntry(string.Empty);
var ipAddressList = ipHostEntry.AddressList;
var ipv4Addresses = Array.FindAll(ipAddressList, a => a.AddressFamily == AddressFamily.InterNetwork);
result = ipv4Addresses[0].ToString();
远程 IP 地址在哪里result
(或本地 IP 地址,取决于您是否在远程工作)。
但是,我想要以下内容:
- 我正在远程工作(使用 RDP)
- 我需要物理机的 IP(运行 RDP 以连接到另一台机器的计算机),而不是远程机器
有没有办法使用 C# 来完成这个?
解决方案
我阅读了很多行代码并浏览了许多文档页面,但这帮助我解决了这个问题:https ://www.codeproject.com/Articles/111430/Grabbing-Information-of-a-Terminal-Services-Sessio
以上可帮助您获取所有会话及其相应 IP 地址的列表。但是,如果您与一台远程服务器有许多 RDP 连接,那么您将想要获取特定客户端的 IP 地址,我这样解决:
[DllImport("Kernel32.dll")]
static extern int GetCurrentProcessId();
[DllImport("Kernel32.dll")]
static extern int ProcessIdToSessionId(int dwProcessid, ref int pSessionId);
[StructLayout(LayoutKind.Sequential)]
private struct WTS_CLIENT_ADDRESS
{
public int iAddressFamily;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] bAddress;
}
private static string GetIpAddressFromSession(int sessionId, IntPtr server)
{
var ipAddress = string.Empty;
if (WTSQuerySessionInformation(server, sessionId, WTS_INFO_CLASS.WTSClientAddress, out IntPtr ipAddressPointer, out uint returnedBytes) == true)
{
var clientAddress = new WTS_CLIENT_ADDRESS();
clientAddress = (WTS_CLIENT_ADDRESS)Marshal.PtrToStructure(ipAddressPointer, clientAddress.GetType());
ipAddress = string.Format("{0}.{1}.{2}.{3}", clientAddress.bAddress[2], clientAddress.bAddress[3], clientAddress.bAddress[4], clientAddress.bAddress[5]);
}
return ipAddress;
}
public static string GetLocalIpAddressWhileRemote()
{
var ipAddress = string.Empty;
var processId = GetCurrentProcessId();
var sessionId = 0;
var hasFoundSessionId = ProcessIdToSessionId(processId, ref sessionId) != 0;
if (hasFoundSessionId)
{
ipAddress = GetIpAddressFromSession(sessionId, IntPtr.Zero);
}
return ipAddress;
}
首先,您获得processId
客户的 并使用它来获得sessionId
. 然后,sessionId
您可以使用WTSQuerySessionInformation
参数WTS_INFO_CLASS.WTSClientAddress
来获取会话 IP 地址。我没有包含 WTS_INFO_CLASS 枚举,你仍然需要自己添加它才能工作。
推荐阅读
- php - 在 PHP 没有密码提示的情况下执行 samba 挂载命令?
- php - 替换 cakephp 3 查询中其他静态词的空或空响应
- c++ - inline 关键字可以改变函数的行为吗?
- c# - 无法隐式转换类型'System.Collections.Generic.IEnumerable
' 到 'System.Collections.Generic.List ' - lua - 在同一个库上多次调用 ffi.load 是不是很糟糕?
- python - 在 Django 中选择一条记录:使用查询集过滤外键
- scala - 在 Scala 中动态访问类变量
- python - 如果我只在测试套件运行期间使用库,它应该在我的 Pipfile 中的普通包还是开发包中?
- .net-core - .net core 2.1 - AddJsonOptions 不起作用
- django - 管理员中的 Django allauth 而不是默认用户