This question मुझे बताता है कि दूरस्थ डेस्कटॉप सत्र का पता कैसे लगाएं।दूरस्थ डेस्कटॉप कनेक्शन का स्रोत खोजें
क्या किसी को पता है कि रिमोट कनेक्शन कहां से शुरू किया गया है, यह पता लगाना संभव है?
-Vegar
This question मुझे बताता है कि दूरस्थ डेस्कटॉप सत्र का पता कैसे लगाएं।दूरस्थ डेस्कटॉप कनेक्शन का स्रोत खोजें
क्या किसी को पता है कि रिमोट कनेक्शन कहां से शुरू किया गया है, यह पता लगाना संभव है?
-Vegar
खिड़कियों जो मशीनों आप के लिए और जो बंदरगाहों पर जुड़े हुए हैं और सिर्फ एक बंदरगाह है कि दूरस्थ डेस्कटॉप का उपयोग करता है का उपयोग करता है के लिए पता पार्स आउट कर जांच करने के लिए netstat का उपयोग में चूंकि यह है।
@ वेगर, आप इस जानकारी को पुनः प्राप्त करने के लिए 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;
क्या 'WTSENumerate सत्र' का उपयोग करना भी आवश्यक है? मुझे लगता है कि सत्र आईडी के लिए 'wts_Current_Session' का उपयोग करना पर्याप्त होगा। –
अपना सत्र प्राप्त करने के लिए, ProcessIdToSessionId –
@Rob का उपयोग करें, आप सही हैं WTSENumerate सत्र फ़ंक्शन सभी सत्रों के लिए जानकारी प्राप्त करना है, मैंने wts_Current_Session और WTSEnumerate सत्रों का उपयोग करके एक उदाहरण पोस्ट किया है। ;) – RRUZ
WTSQuerySessionInformation क्लाइंट IP रिटर्न के रूप में ग्राहक यह रिपोर्ट qwinsta
चलाने की कोशिश करें, यह शायद हो जाएगा (एक) का यह स्थानीय आईपी पता है। यदि आप वास्तविक आईपी पता और पोर्ट को कनेक्ट करना चाहते हैं जो आप कनेक्ट हैं, तो आप WinStationQueryInformationW का उपयोग जानकारी वर्ग WinStationRemoteAddress के साथ कर सकते हैं। आपको जेडी अपिलिब से मेरी इकाई जवाविंटा की आवश्यकता होगी।
मैं भी एक ही इकाई में एक सरल आवरण प्रदान की है:
function WinStationGetRemoteIPAddress(hServer: HANDLE; SessionId: DWORD;
var RemoteIPAddress: WideString; var Port: WORD): Boolean;
मेरे लिए, यह काम किया, यह जुड़ा हुआ मशीन के नाम हो जाता है।
Environment.GetEnvironmentVariable("CLIENTNAME")
यदि आप रिमोट सत्र आईडी प्राप्त करना चाहते हैं और सिट्रिक्स के माध्यम से जुड़े आईपी पते को प्राप्त करना चाहते हैं तो आप नीचे का उपयोग कर सकते हैं। यह तब चलाने के लिए डिज़ाइन किया गया था जब कोई उपयोगकर्ता किसी साइट्रिक्स सत्र के माध्यम से किसी सर्वर से कनेक्ट होता है और उस 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();
}
}
}
और चूंकि दूरस्थ डेस्कटॉप हमेशा पोर्ट 3389 का उपयोग करता है, यह काम करेगा। धन्यवाद! – Vegar
यह केवल तभी काम करेगा यदि आपके पास एक रिमोट कनेक्शन है, तो आप नहीं देख सकते कि कौन से सत्र दूरस्थ मशीन से कनेक्ट होते हैं। –
वर्तमान लोकेल से प्रभावित 'नेटस्टैट' का उत्पादन है? यह स्ट्रिंग पार्सिंग * अधिक * अधिक जटिल बना सकता है। बाहरी प्रोग्राम और चर आउटपुट प्रारूपों पर निर्भर करता है जो एक एपीआई समाधान पसंद करते हैं। –