首页 > 解决方案 > 在远程会话中查找物理机的 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 地址,取决于您是否在远程工作)。

但是,我想要以下内容:

有没有办法使用 C# 来完成这个?

标签: c#networkingnetwork-programmingip

解决方案


我阅读了很多行代码并浏览了许多文档页面,但这帮助我解决了这个问题: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 枚举,你仍然需要自己添加它才能工作。


推荐阅读