Я прочитал много строк кода и просмотрел множество страниц документации, но это помогло мне решить: 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, вам все равно придется добавить это самостоятельно, чтобы оно работало.