2010-02-15 90 views
2

我的經理向我指出了一些我們的會計應用程序可以執行的很好的事情,因爲它可以根據主機的機器名稱加載不同的設置在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

您是否檢查過WTS_INFO_CLASS枚舉?

您可以撥打電話WTSQuerySessionInformation獲取此信息。

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

+0

點上 - 感謝布賴恩。 –

1

您也可以使用Cassia library爲這個,如果你不想處理P-調用 - 代碼將是:

new TerminalServicesManager().CurrentSession.ClientName