воскресенье, 4 марта 2012 г.

Получение имени компьютера подключенного к терминалу

Вводная: Необходимо было получить имя компьютера (имя клиента) с которого прошло подключение к терминальному серверу (windows 2003, RDP). Реализация на C#


Решение: Стандартного класса для получения имени нет, реализуется через обращение к 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());
}
Решение не моё, было найдено на просторах интернета.

Комментариев нет:

Отправить комментарий