2010-03-17 18 views
10

This question मुझे बताता है कि दूरस्थ डेस्कटॉप सत्र का पता कैसे लगाएं।दूरस्थ डेस्कटॉप कनेक्शन का स्रोत खोजें

क्या किसी को पता है कि रिमोट कनेक्शन कहां से शुरू किया गया है, यह पता लगाना संभव है?

-Vegar

उत्तर

4

खिड़कियों जो मशीनों आप के लिए और जो बंदरगाहों पर जुड़े हुए हैं और सिर्फ एक बंदरगाह है कि दूरस्थ डेस्कटॉप का उपयोग करता है का उपयोग करता है के लिए पता पार्स आउट कर जांच करने के लिए netstat का उपयोग में चूंकि यह है।

+0

और चूंकि दूरस्थ डेस्कटॉप हमेशा पोर्ट 3389 का उपयोग करता है, यह काम करेगा। धन्यवाद! – Vegar

+2

यह केवल तभी काम करेगा यदि आपके पास एक रिमोट कनेक्शन है, तो आप नहीं देख सकते कि कौन से सत्र दूरस्थ मशीन से कनेक्ट होते हैं। –

+1

वर्तमान लोकेल से प्रभावित 'नेटस्टैट' का उत्पादन है? यह स्ट्रिंग पार्सिंग * अधिक * अधिक जटिल बना सकता है। बाहरी प्रोग्राम और चर आउटपुट प्रारूपों पर निर्भर करता है जो एक एपीआई समाधान पसंद करते हैं। –

9

@ वेगर, आप इस जानकारी को पुनः प्राप्त करने के लिए WTSEnumerateSessions और WTSQuerySessionInformation फ़ंक्शंस का उपयोग कर सकते हैं।

Jedi Api Headers का उपयोग करके उदाहरण के लिए यह link देखें।

इस कोड को चेक करें।

program ProjectTsInfo; 

{$APPTYPE CONSOLE} 

Uses 
    Windows, 
    JwaWinType, 
    JwaWtsApi32, 
    JwaWinsock2, 
    SysUtils, 
    TypInfo; 


type 
    PWtsSessionInfoAArray = ^TWtsSessionInfoAArray; 
    TWtsSessionInfoAArray = array[0..ANYSIZE_ARRAY-1] of WTS_SESSION_INFOA; 

//Get the info for all clients connected 
procedure GetAll_TSClientsInfo; 
var 
    SessionInfoAArray: PWtsSessionInfoAArray; 
    ClientAddr  : PWtsClientAddress; 
    ClientName  : PAnsiChar; 
    //ClientInfo  : PWTSCLIENT; 
    RetBytes   : Cardinal; 
    IPAddr   : String; 
    i    : integer; 
    pCount   : Cardinal; 
    SessionId  : Cardinal; 
begin 

    if WtsEnumerateSessions(WTS_CURRENT_SERVER, 0, 1, PWTS_SESSION_INFO(SessionInfoAArray), pCount) then 
    begin 

    for i := 0 to pCount - 1 do 
    begin 
     SessionId:=SessionInfoAArray^[i].SessionId; 
     WTSQuerySessionInformation(WTS_CURRENT_SERVER, SessionId, WTSClientAddress, Pointer(ClientAddr), RetBytes); 
     WTSQuerySessionInformation(WTS_CURRENT_SERVER, SessionId, WTSClientName, Pointer(ClientName), RetBytes); 
     //WTSQuerySessionInformation(WTS_CURRENT_SERVER, SessionId, WTSClientInfo, Pointer(ClientInfo), RetBytes); //This value is supported for Windows Server 2008 and Windows Vista with SP1. 

    try 
     case ClientAddr^.AddressFamily of 
     AF_INET: 
      IPAddr:= Format('%d.%d.%d.%d', [ 
      ClientAddr^.Address[2], 
      ClientAddr^.Address[3], 
      ClientAddr^.Address[4], 
      ClientAddr^.Address[5] 
      ]); 
     else 
     IPAddr:= '<unknow>'; 
     end; 

     WriteLn(Format('Session Id : %d ', [SessionId])); 
     WriteLn(Format('Client Name : %s ', [ClientName])); 
     WriteLn(Format('Station Name: %s ', [SessionInfoAArray^[i].pWinStationName])); 
     WriteLn(Format('State  : %s ', [GetEnumName(TypeInfo(WTS_CONNECTSTATE_CLASS),integer(SessionInfoAArray^[i].State))])); 
     WriteLn(Format('IP   : %s ', [IPAddr])); 

     //supported for Windows Server 2008 and Windows Vista with SP1. 
     { 
     WriteLn(Format('ClientName  : %s ', [ClientInfo^.ClientName])); 
     WriteLn(Format('Domain   : %s ', [ClientInfo^.Domain])); 
     WriteLn(Format('UserName  : %s ', [ClientInfo^.UserName])); 
     WriteLn(Format('WorkDirectory : %s ', [ClientInfo^.WorkDirectory])); 
     WriteLn(Format('InitialProgram : %s ', [ClientInfo^.InitialProgram])); 
     WriteLn(Format('EncryptionLevel : %d ', [ClientInfo^.EncryptionLevel])); 
     WriteLn(Format('HRes   : %d ', [ClientInfo^.HRes])); 
     WriteLn(Format('VRes   : %d ', [ClientInfo^.VRes])); 
     WriteLn(Format('ColorDepth  : %d ', [ClientInfo^.ColorDepth])); 
     WriteLn(Format('ClientDirectory : %s ', [ClientInfo^.ClientDirectory])); 
     } 
     Writeln(''); 

    finally 
     WTSFreeMemory(ClientAddr); 
     WTSFreeMemory(ClientName); 
    end; 
    end; 
    end; 

    WtsFreeMemory(SessionInfoAArray); 
end; 

//Get the ip address of the actual connected client 
function GetIpActualClient : string; 
var 
    ClientAddr  : PWtsClientAddress; 
    RetBytes   : Cardinal; 
    IPAddr   : String; 
    SessionId  : Cardinal; 
begin 
     SessionId:=WTS_CURRENT_SESSION; 
     WTSQuerySessionInformation(WTS_CURRENT_SERVER, SessionId, WTSClientAddress, Pointer(ClientAddr), RetBytes); 
     try 
     case ClientAddr^.AddressFamily of 
      AF_INET: 
      IPAddr:= Format('%d.%d.%d.%d', [ 
       ClientAddr^.Address[2], 
       ClientAddr^.Address[3], 
       ClientAddr^.Address[4], 
       ClientAddr^.Address[5] 
       ]); 
      else 
      IPAddr:= '<unknow>'; 
     end; 
     Result:=IPAddr; 
     finally 
     WTSFreeMemory(ClientAddr); 
     end; 
end; 

begin 
    Writeln('IP Actual client '+GetIpActualClient); 
    Writeln('-----------------------------------'); 

    GetAll_TSClientsInfo; 
    Readln; 
end. 

अद्यतन

@Remko कहते हैं, WTSClientAddress प्रकार के साथ WTSQuerySessionInformation समारोह, ग्राहक के स्थानीय IP लौट सकते हैं। यदि आप असली आईपी प्राप्त करना चाहते हैं तो आप JwaWinSta इकाई में स्थित WinStationGetRemoteIPAddress सहायक समारोह का उपयोग कर सकते हैं।

Var 
Port : Word; 
IpAddr : WideString; 
Begin 
WinStationGetRemoteIPAddress(WTS_CURRENT_SERVER,WTS_CURRENT_SESSION,IpAddr,Port); 
End; 
+0

क्या 'WTSENumerate सत्र' का उपयोग करना भी आवश्यक है? मुझे लगता है कि सत्र आईडी के लिए 'wts_Current_Session' का उपयोग करना पर्याप्त होगा। –

+0

अपना सत्र प्राप्त करने के लिए, ProcessIdToSessionId –

+0

@Rob का उपयोग करें, आप सही हैं WTSENumerate सत्र फ़ंक्शन सभी सत्रों के लिए जानकारी प्राप्त करना है, मैंने wts_Current_Session और WTSEnumerate सत्रों का उपयोग करके एक उदाहरण पोस्ट किया है। ;) – RRUZ

1

WTSQuerySessionInformation क्लाइंट IP रिटर्न के रूप में ग्राहक यह रिपोर्ट qwinsta

4

चलाने की कोशिश करें, यह शायद हो जाएगा (एक) का यह स्थानीय आईपी पता है। यदि आप वास्तविक आईपी पता और पोर्ट को कनेक्ट करना चाहते हैं जो आप कनेक्ट हैं, तो आप WinStationQueryInformationW का उपयोग जानकारी वर्ग WinStationRemoteAddress के साथ कर सकते हैं। आपको जेडी अपिलिब से मेरी इकाई जवाविंटा की आवश्यकता होगी।

मैं भी एक ही इकाई में एक सरल आवरण प्रदान की है:

function WinStationGetRemoteIPAddress(hServer: HANDLE; SessionId: DWORD; 
    var RemoteIPAddress: WideString; var Port: WORD): Boolean; 
+0

+1 @ रेमको आप सही हैं WTSClientAddress वास्तविक आईपी के बजाय स्थानीय आईपी की रिपोर्ट कर सकते हैं। मैं अपना जवाब अपडेट करता हूं। पीएस: जेडी एपी हेडर में आपके लिए बहुत अच्छा काम है। ;) – RRUZ

+0

@RRUZ: आपका स्वागत है! – Remko

3

मेरे लिए, यह काम किया, यह जुड़ा हुआ मशीन के नाम हो जाता है।

Environment.GetEnvironmentVariable("CLIENTNAME") 
0

यदि आप रिमोट सत्र आईडी प्राप्त करना चाहते हैं और सिट्रिक्स के माध्यम से जुड़े आईपी पते को प्राप्त करना चाहते हैं तो आप नीचे का उपयोग कर सकते हैं। यह तब चलाने के लिए डिज़ाइन किया गया था जब कोई उपयोगकर्ता किसी साइट्रिक्स सत्र के माध्यम से किसी सर्वर से कनेक्ट होता है और उस IP पते के लिए स्ट्रिंग को प्रदर्शित/बनाता है जो इसे कनेक्ट कर रहा है।

// Prints out ICA or RDP session ID of current user & gets ICA session clientAddress variable 

using System; 
using Microsoft.Win32; 

namespace ViaRegedit 
{ 
    class Program03 
    { 
     static void Main(string[] args) 
     { 
      // Obtain an instance of RegistryKey for the CurrentUser registry 
      RegistryKey rkCurrentUser = Registry.CurrentUser; 
      // Obtain the test key (read-only) and display it. 
      RegistryKey rkTest = rkCurrentUser.OpenSubKey("Remote"); 

      foreach (string valueName in rkTest.GetSubKeyNames()) 
      { 
       //Getting path to RDP/Citrix session ID 
       string RDPICApath = ""; 
       if (rkTest.OpenSubKey(valueName) != null && rkTest.OpenSubKey(valueName) != null) { RDPICApath = rkTest.OpenSubKey(valueName).ToString(); } 
       Console.WriteLine("Getting CurrentUser ICA-RDP path from string = " + RDPICApath); 

       //Split RDPICApath to get session number 
       string RDPICAnumber = RDPICApath.Substring(RDPICApath.LastIndexOf('\\') + 1); 
       Console.WriteLine("Current User RDPICAnumber = " + RDPICAnumber); 

       //Getting reg local machine info for Citrix based on RDP/Citrix session ID "RDPICAnumber" 
       string regLocal = @"SOFTWARE\Citrix\Ica\Session\" + RDPICAnumber + @"\Connection"; 
       RegistryKey localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); 
       RegistryKey citrixKey = localKey.OpenSubKey(regLocal); 
       Console.WriteLine("Registry " + citrixKey + " Does Exist - going to get ClientAddress"); 
       //getting clietAddress var from citrixKey 
       string clientAddress = ""; 
       if (citrixKey != null && citrixKey.GetValue("clientAddress") != null) 
        {clientAddress = citrixKey.GetValue("clientAddress").ToString();} 
        Console.WriteLine("Getting current user clientAddress from string = " + clientAddress); 
      } 
      rkTest.Close(); 
      rkCurrentUser.Close(); 
      Console.ReadLine(); 
     } 
    } 

} 
संबंधित मुद्दे