Определить имя клиентского компьютера при открытом сеансе RDP - PullRequest
2 голосов
/ 15 февраля 2010

Мой менеджер указал мне на несколько изящных вещей, которые может сделать одно из наших бухгалтерских приложений, поскольку оно может загружать различные настройки в зависимости от имени компьютера хоста и имени компьютера клиента, когда пакет открывается в сеансе RDP.

Мы хотим обеспечить аналогичную функциональность в одном из приложений моей компании.

Я узнал на этом сайте, как обнаружить , если Я нахожусь в сеансе RDP, но у меня возникают проблемы с поиском информации где-либо о том, как определить имя клиентского компьютера.

Любые указатели в правильном направлении были бы великолепны.

Я пишу на C # для .NET 3.5

EDIT

Пример кода, который я собрал воедино из приведенного ниже совета - для каждого, у кого есть возможность использовать WTSQuerySessionInformation, этого будет достаточно, чтобы понять, что происходит. Обратите внимание, что это не обязательно лучший способ сделать это - просто отправная точка, которая мне показалась полезной.

Когда я запускаю это локально, я получаю скучные, ожидаемые ответы. Когда я запускаю его на нашем локальном офисном сервере в сеансе RDP, я вижу свое собственное имя компьютера в свойстве WTSClientName.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace TerminalServicesTest
{
    class Program
    {
        const int WTS_CURRENT_SESSION = -1;
        static readonly IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;

        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            uint byteCount;

            foreach (WTS_INFO_CLASS item in Enum.GetValues(typeof(WTS_INFO_CLASS)))
            {
                Program.WTSQuerySessionInformation(
                    WTS_CURRENT_SERVER_HANDLE,
                    WTS_CURRENT_SESSION,
                    item,
                    out sb,
                    out byteCount);

                Console.WriteLine("{0}({1}): {2}", item.ToString(), byteCount, sb);
            }
            Console.WriteLine();
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

        [DllImport("Wtsapi32.dll")]
        public static extern bool WTSQuerySessionInformation(
            IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass, out StringBuilder ppBuffer, out uint pBytesReturned);
    }

    enum WTS_INFO_CLASS 
    {
        WTSInitialProgram = 0,
        WTSApplicationName = 1,
        WTSWorkingDirectory = 2,
        WTSOEMId = 3,
        WTSSessionId = 4,
        WTSUserName = 5,
        WTSWinStationName = 6,
        WTSDomainName = 7,
        WTSConnectState = 8,
        WTSClientBuildNumber = 9,
        WTSClientName = 10,
        WTSClientDirectory = 11,
        WTSClientProductId = 12,
        WTSClientHardwareId = 13,
        WTSClientAddress = 14,
        WTSClientDisplay = 15,
        WTSClientProtocolType = 16,
        WTSIdleTime = 17,
        WTSLogonTime = 18,
        WTSIncomingBytes = 19,
        WTSOutgoingBytes = 20,
        WTSIncomingFrames = 21,
        WTSOutgoingFrames = 22,
        WTSClientInfo = 23,
        WTSSessionInfo = 24,
        WTSSessionInfoEx = 25,
        WTSConfigInfo = 26,
        WTSValidationInfo = 27,
        WTSSessionAddressV4 = 28,
        WTSIsRemoteSession = 29
    }
}

Ответы [ 2 ]

2 голосов
/ 15 февраля 2010

Вы зарегистрировались в WTS_INFO_CLASS перечислении?

Вы можете получить эту информацию, позвонив: WTSQuerySessionInformation .

Я не уверен в точном значении, указанном в WTS_INFO_CLASS, которое вам нужно, но оно выглядит так: WTSClientName.

1 голос
/ 29 мая 2010

Вы также можете использовать библиотеку Cassia для этого, если вы не хотите иметь дело с P-вызовами - код будет:

new TerminalServicesManager().CurrentSession.ClientName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...