Нахождение IP-адреса физической машины в удаленном сеансе - PullRequest
0 голосов
/ 28 января 2020

Я просмотрел 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();

Где result - это удаленный IP-адрес (или локальный, в зависимости от того, работаете ли вы удаленно).

Однако мне нужно следующее:

  • Я работаю удаленно (используя RDP)
  • Мне нужен IP-адрес физической машины (компьютера, на котором работает RDP для подключения к другой машине), а не к удаленной машине

Есть ли способ выполнить sh, используя C#?

1 Ответ

0 голосов
/ 30 января 2020

Я прочитал много строк кода и просмотрел множество страниц документации, но это помогло мне решить: https://www.codeproject.com/Articles/111430/Grabbing-Information-of-a-Terminal-Services-Sessio

Вышеприведенный список поможет вам получить список всех сессий и их соответствующие IP-адреса. Однако, если у вас есть много RDP-подключений к одному удаленному серверу, вы захотите получить IP-адрес вашего указанного c клиента, я решил это следующим образом:

[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, вам все равно придется добавить это самостоятельно, чтобы оно работало.

...