Решение: Стандартного класса для получения имени нет, реализуется через обращение к Wtsapi32.dll.
Создаём класс TerminalClientName со следующим содержанием -
using System; using System.Runtime.InteropServices; namespace test_1Clauncher { static class TerminalClientName { /// <summary> /// Gets the name of the client system. /// </summary> internal static string GetTerminalServicesClientName() { IntPtr buffer = IntPtr.Zero; string clientName = null; int bytesReturned; bool success = NativeMethods.WTSQuerySessionInformation( NativeMethods.WTS_CURRENT_SERVER_HANDLE, NativeMethods.WTS_CURRENT_SESSION, NativeMethods.WTS_INFO_CLASS.WTSClientName, out buffer, out bytesReturned); if (success) { clientName = Marshal.PtrToStringUni( buffer, bytesReturned / 2 /* Because the DllImport uses CharSet.Unicode */ ); NativeMethods.WTSFreeMemory(buffer); } return clientName; } } public static class NativeMethods { public static readonly IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero; public const int WTS_CURRENT_SESSION = -1; public enum WTS_INFO_CLASS { WTSClientName = 10 } [DllImport("Wtsapi32.dll", CharSet = CharSet.Unicode)] public static extern bool WTSQuerySessionInformation( IntPtr hServer, Int32 sessionId, WTS_INFO_CLASS wtsInfoClass, out IntPtr ppBuffer, out Int32 pBytesReturned); /// <summary> /// The WTSFreeMemory function frees memory allocated by a Terminal /// Services function. /// </summary> /// <param name="memory">Pointer to the memory to free.</param> [DllImport("wtsapi32.dll", ExactSpelling = true, SetLastError = false)] public static extern void WTSFreeMemory(IntPtr memory); } }Теперь чтобы получить имя клиента, достаточно вызвать созданный нами класс-
private void button1_Click(object sender, EventArgs e) { MessageBox.Show(TerminalClientName.GetTerminalServicesClientName()); }Решение не моё, было найдено на просторах интернета.
Комментариев нет:
Отправить комментарий