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 लग गर्नुहोस्, किनकि त्यही प्रयोगकर्ता फेरि जडान भई नयाँ मान पाउन सक्छ। क्लाइन्टको नाम वा रिपोर्ट गरिएको ठेगाना—कुनै पनि पहुँच दिनका लागि पर्याप्त प्रमाण होइन।