2

私のマネージャーは、RDPセッションでパッケージを開いたときに、ホストのマシン名とクライアントのマシン名に基づいて異なる設定をロードできるため、会計アプリケーションの1つで実行できるいくつかの気の利いたことを指摘しました。

私の会社のアプリケーションの1つで同様の機能を提供したいと考えています。

このサイトで、RDPセッションに参加しているかどうかを検出する方法を見つけましたが、クライアントコンピューターの名前を検出する方法に関する情報をどこでも見つけるのに問題があります。

正しい方向へのポインタは素晴らしいでしょう。

.NET 3.5用のC#でコーディングしています

編集

以下のアドバイスからまとめたサンプルコード-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
    }
}
4

2 に答える 2

2

WTS_INFO_CLASS列挙型にチェックインしましたか?

この情報は、WTSQuerySessionInformationを呼び出すことで取得できます。

必要なWTS_INFO_CLASSにリストされている正確な値はわかりませんが、次のようになりますWTSClientName

于 2010-02-15T02:35:08.023 に答える
1

P-Invokesを処理したくない場合は、これにCassiaライブラリを使用することもできます。コードは次のようになります。

new TerminalServicesManager().CurrentSession.ClientName
于 2010-05-29T18:21:32.640 に答える