在RDP会话打开时检测客户端计算机名称

时间:2010-02-15 02:29:17

标签: session client terminal rdp

我的经理向我指出了一些我们的会计应用程序可以做的好事,因为它可以根据主机的机器名称和客户端的机器名称加载不同的设置在RDP会话中打开包时。

我们希望在我公司的一个应用程序中提供类似的功能。

我在这个网站上发现如何检测如果我在RDP会话中,但是我无法在任何地方找到有关如何检测客户端计算机名称的信息。

任何正确方向的指针都会很棒。

我正在使用C#编写.NET 3.5

修改

我从下面的建议中拼凑了示例代码 - 对于有权使用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 个答案:

答案 0 :(得分:2)

您是否已查看WTS_INFO_CLASS枚举?

您可以致电:WTSQuerySessionInformation

获取此信息

我不确定您需要的WTS_INFO_CLASS中列出的确切值,但它看起来像是:WTSClientName

答案 1 :(得分:1)

如果您不想处理P-Invokes,您也​​可以使用Cassia library - 代码如下:

new TerminalServicesManager().CurrentSession.ClientName