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 ലോഗ് ചെയ്യുക, കാരണം അതേ ഉപയോക്താവിന് വീണ്ടും കണക്റ്റ് ചെയ്ത് പുതിയ മൂല്യം ലഭിക്കാം. ക്ലയന്റിന്റെ പേരോ റിപ്പോർട്ട് ചെയ്ത വിലാസമോ പ്രവേശനം നൽകാൻ മതിയായ തെളിവല്ല.

അനുബന്ധ ലേഖനങ്ങൾ