Windows ఒక RDP సెషన్ కోసం ఏ చిరునామాను నివేదిస్తుంది?
WTS API ఒక RDP సెషన్ కోసం నివేదించిన క్లయింట్ చిరునామాను తిరిగి ఇస్తుంది, రిజిస్ట్రీ ఇవ్వదు. సరైన సెషన్ ID అడగండి మరియు IPv4 లేదా IPv6 ను సరిగ్గా డీకోడ్ చేయండి.
RDP సెషన్ కు క్లయింట్ చిరునామా అవసరం, స్పష్టమైన మూలాలు ఏకీభవించవు. CLIENTNAME కంప్యూటర్ పేరును ఇస్తుంది, రిజిస్ట్రీ ఇతర సెషన్ల విలువలను ఉంచుతుంది, మరియు సాకెట్ ఇతర వైపు క్లయింట్ కాకుండా గేట్వే లేదా NAT చిరునామా కావచ్చు. Windows ప్రతి సెషన్ కు నివేదించిన క్లయింట్ చిరునామాను అందిస్తుంది, కానీ మీరు సరైన సెషన్ అడగాలి మరియు ప్రతిస్పందనను సరిగ్గా డీకోడ్ చేయాలి.
వెతుకుడును ఒక సెషన్ కు స్థిరపరచండి
వ్యక్తితో కాదు, సెషన్ తో ప్రారంభించండి. Windows RDP హోస్ట్ ఒక ఖాతా కోసం అనేక సెషన్లను కలిగి ఉండవచ్చు, మరియు తిరిగి కనెక్ట్ కాకముందు చూసిన చిరునామా ఇప్పుడు క్రియాశీల లింక్ తో సరిపోకపోవచ్చు. సెషన్ ID, వినియోగదారు మరియు పరిశీలన సమయాన్ని కలిసి నమోదు చేయండి. సెషన్ ID అనేది API ఆశించే కీ, మరియు రెండు సెషన్లు గందరగోళం కాకుండా కాపాడే విలువ కూడా అదే.
హోస్ట్ పై, ఇన్స్టాల్ చేసిన సెషన్ సాధనాలు ఏమి ఉందో జాబితా చేస్తాయి; పరిపాలనా వీక్షణను మీకు దానిపై హక్కు ఉన్నప్పుడే ఉపయోగించండి. ఎంచుకున్న ID ను ప్రశ్నకు ముందే నిర్ధారించండి, ఎందుకంటే పునర్వినియోగించిన ID మరో సెషన్ డేటాను తిరిగి ఇస్తుంది.
qwinsta
ఆ ID కోసం WTSQuerySessionInformationW ను పిలవండి
Terminal Services API సమాచార తరగతి 14 తో ప్రశ్నకు సమాధానం ఇస్తుంది, WTSClientAddress. Windows లో చిన్న ctypes రేపర్ సరిపోతుంది, మరియు అది మరో వినియోగదారు hive చదవడాన్ని నివారిస్తుంది. క్రింది కోడ్ స్పష్టమైన సెషన్ ID తీసుకుని స్థానిక హోస్ట్ ను అడుగుతుంది.
import ctypes
import ipaddress
import socket
from ctypes import wintypes
class WTS_CLIENT_ADDRESS(ctypes.Structure):
_fields_ = [("AddressFamily", wintypes.DWORD),
("Address", ctypes.c_ubyte * 20)]
wts = ctypes.WinDLL("Wtsapi32", use_last_error=True)
query = wts.WTSQuerySessionInformationW
query.argtypes = [wintypes.HANDLE, wintypes.DWORD, ctypes.c_int,
ctypes.POINTER(ctypes.c_void_p), ctypes.POINTER(wintypes.DWORD)]
query.restype = wintypes.BOOL
free = wts.WTSFreeMemory
free.argtypes = [ctypes.c_void_p]
def client_address(session_id):
buf = ctypes.c_void_p()
size = wintypes.DWORD()
if not query(None, session_id, 14, ctypes.byref(buf), ctypes.byref(size)):
raise ctypes.WinError(ctypes.get_last_error())
try:
if size.value < ctypes.sizeof(WTS_CLIENT_ADDRESS):
raise RuntimeError("short WTS buffer")
value = ctypes.cast(buf, ctypes.POINTER(WTS_CLIENT_ADDRESS)).contents
raw = bytes(value.Address)
if value.AddressFamily == socket.AF_INET:
addr = ipaddress.ip_address(raw[2:6])
elif value.AddressFamily == socket.AF_INET6:
addr = ipaddress.ip_address(raw[:16])
else:
return None
return None if addr.is_unspecified else str(addr)
finally:
free(buf)
ఇప్పుడే ధృవీకరించిన పూర్ణాంక సెషన్ ID ను పంపండి, మరియు స్థానిక మెషీన్ కోసం శూన్య సర్వర్ హ్యాండిల్ ఉంచుకోండి. విఫలమైన పిలుపును లేని చిరునామాగా కాకుండా లోపంగా పరిగణించండి, ఎందుకంటే రెండూ వేర్వేరు ముగింపులకు దారితీస్తాయి. మరో వినియోగదారు సెషన్ ను ప్రశ్నించడానికి తగిన Query Information అనుమతి అవసరం, కాబట్టి తక్షణమే అధికారాలను పెంచే బదులు ఆ అనుమతి ఇచ్చిన ఖాతా క్రింద సాధనాన్ని నడపండి. తిరిగి ఇచ్చిన బఫర్ API కు చెందుతుంది మరియు డీకోడింగ్ విఫలమైనా దాన్ని విడుదల చేయాలి.
కుటుంబాన్ని డీకోడ్ చేయండి, తర్వాత బఫర్ ను విడుదల చేయండి
నిర్మాణం IP స్ట్రింగ్ కాదు. దాని కుటుంబ క్షేత్రం ఇరవై చిరునామా బైట్లను ఎలా చదవాలో నిర్ణయిస్తుంది: IPv4 రెండు ఆఫ్సెట్ వద్ద ప్రారంభమవుతుంది, IPv6 శూన్య ఆఫ్సెట్ వద్ద ప్రారంభమవుతుంది. నిర్దిష్టం కాని చిరునామా అంటే క్లయింట్ ఏదీ నివేదించలేదు, ఇది ఖాళీ స్ట్రింగ్ కు సమానం కాదు. Remote Desktop Gateway కనెక్షన్లు చిరునామా అందుబాటులో లేని సందర్భంగా నమోదు చేయబడ్డాయి, కాబట్టి గేట్వే ద్వారా వెళ్లే సెషన్ క్లయింట్ యొక్క నిజమైన చిరునామా గురించి ఉపయోగకరమైనది ఏదీ నివేదించదు. అప్పుడు సహసంబంధం గేట్వే యొక్క స్వంత రికార్డులకు మారాలి.
డీబగ్ చేస్తున్నప్పుడు కుటుంబాన్ని చిరునామా పక్కన ముద్రించండి, ఎందుకంటే రెండింటి మధ్య అసమానత నమ్మదగిన కానీ తప్పు విలువకు సాధారణ కారణం. బఫర్ ను finally బ్లాక్ లో WTSFreeMemory తో విడుదల చేయండి, తద్వారా మినహాయింపు దాన్ని లీక్ చేయదు.
నివేదించిన చిరునామాను సాక్ష్యం నుండి వేరు చేయండి
నివేదించిన క్లయింట్ చిరునామా క్లయింట్ అందించిన ప్రకటన, నమ్మదగిన పరిశీలన కాదు. అది TCP ఇతర వైపు కాదు, VPN గేట్వే లీజ్ పట్టిక కాదు, మరియు క్లయింట్ యొక్క పబ్లిక్ చిరునామా కూడా కాదు. నిజమైన ప్రశ్న ఏ VPN లీజ్ ఒక వ్యక్తికి చెందుతుంది అని అయితే, అదే సమయంలో VPN సర్వర్ యొక్క ప్రామాణీకరించిన సెషన్ రికార్డును సహసంబంధం చేయండి. ప్రశ్న ఏ మూలం శ్రోతను చేరుకుంది అని అయితే, కనెక్షన్ పట్టిక లేదా అనుమతించిన సర్వర్ వైపు లాగ్లను చదవండి.
ఏదైనా మద్దతు సాధనంలో ఈ విలువలను విడివిడిగా లేబుల్ చేసి ఉంచండి. తప్పిపోయిన WTS ఫలితం మరో సెషన్ నుండి వచ్చిన ఏకపక్ష రిజిస్ట్రీ విలువకు తిరిగి వెళ్లకుండా తప్పిపోయినట్లే ఉండాలి. చిరునామా పక్కన సెషన్ ID ను లాగ్ చేయండి, ఎందుకంటే అదే వినియోగదారు తిరిగి కనెక్ట్ అయి కొత్త విలువ పొందవచ్చు. క్లయింట్ పేరు లేదా నివేదించిన చిరునామా—ఏదీ యాక్సెస్ ఇవ్వడానికి సరిపోయే సాక్ష్యం కాదు.