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 लॉग करा, कारण तोच वापरकर्ता पुन्हा जोडून नवीन मूल्य मिळवू शकतो। क्लायंटचे नाव किंवा नोंदवलेला पत्ता—दोन्हीपैकी कोणतेही प्रवेश देण्यासाठी पुरेसा पुरावा नाही।

संबंधित लेख