Windows huripoti anwani gani kwa kikao cha RDP?
API ya WTS hurudisha anwani ya mteja iliyoripotiwa kwa kikao kimoja cha RDP, na rejista haifanyi hivyo. Uliza kitambulisho sahihi cha kikao na utengue IPv4 au IPv6 kwa usahihi.
Kikao cha RDP kinahitaji anwani ya mteja, na vyanzo dhahiri havikubaliani. CLIENTNAME hutoa jina la kompyuta, rejista huhifadhi thamani kutoka vikao vingine, na upande wa pili wa soketi unaweza kuwa anwani ya lango au NAT badala ya mteja. Windows hufichua anwani ya mteja iliyoripotiwa kwa kila kikao, lakini lazima uulize kikao sahihi na utengue jibu kwa usahihi.
Funga utafutaji kwenye kikao kimoja
Anza na kikao, sio mtu. Mwenyeji wa RDP wa Windows anaweza kubeba vikao kadhaa kwa akaunti moja, na anwani iliyoonekana kabla ya kuunganishwa upya inaweza kutolingana tena na kiungo hai. Andika kitambulisho cha kikao, mtumiaji na muda wa uchunguzi pamoja. Kitambulisho cha kikao ndicho ufunguo ambao API inatarajia, na ndiyo thamani inayozuia vikao viwili kuchanganywa.
Kwenye mwenyeji, zana za kikao zilizosakinishwa huorodhesha kilichoopo; tumia mwonekano wa utawala tu unapostahili. Thibitisha kitambulisho ulichochagua mara moja kabla ya swali, kwa sababu kitambulisho kilichotumika tena hurudisha data ya kikao kingine.
qwinsta
Ita WTSQuerySessionInformationW kwa kitambulisho hicho
API ya Terminal Services hujibu swali kwa darasa la taarifa 14, WTSClientAddress. Kifuniko kidogo cha ctypes kinatosha kwenye Windows, na kinaepuka kusoma hive ya mtumiaji mwingine. Msimbo ulio hapa chini huchukua kitambulisho bayana cha kikao na kuuliza mwenyeji wa ndani.
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)
Pitisha kitambulisho cha kikao kama nambari kamili ulichothibitisha hivi punde, na uendelee kushikilia kishikio cha sifuri cha seva kwa mashine ya ndani. Chukulia mwito ulioshindikana kama hitilafu na sio kama anwani isiyopo, kwa sababu vyote viwili hupelekea hitimisho tofauti. Swali kuhusu kikao cha mtumiaji mwingine huhitaji idhini inayofaa ya Query Information, kwa hivyo endesha zana chini ya akaunti iliyopewa idhini hiyo badala ya kuongeza mapendeleo kwa haraka. Bafa iliyorudishwa ni mali ya API na lazima ifunguliwe hata utenguaji unaposhindikana.
Tengua familia, kisha fungua bafa
Muundo si mfuatano wa IP. Sehemu yake ya familia huamua jinsi baiti ishirini za anwani zinasomwa: IPv4 huanza kwenye ofseti mbili, wakati IPv6 huanza kwenye ofseti sifuri. Anwani isiyobainishwa inamaanisha mteja hakuripoti yoyote, jambo ambalo si sawa na mfuatano tupu. Miunganisho ya Remote Desktop Gateway imeandikwa kama kisa ambacho anwani haipatikani, kwa hivyo kikao kinachopitia lango hakiripoti chochote cha manufaa kuhusu anwani halisi ya mteja. Uhusiano basi unapaswa kuhamia kwenye kumbukumbu za lango lenyewe.
Chapisha familia kando ya anwani unapofanya utatuzi, kwa sababu kutokupatana kati ya hizo mbili ndio sababu ya kawaida ya thamani inayoaminika lakini isiyo sahihi. Fungua bafa kwa WTSFreeMemory ndani ya bloku finally ili hitilafu isiivuje.
Tenganisha anwani iliyoripotiwa na uthibitisho
Anwani ya mteja iliyoripotiwa ni tamko analotoa mteja, sio uchunguzi wa kuaminika. Si upande wa pili wa TCP, si jedwali la ukodishaji la lango la VPN, na si anwani ya umma ya mteja. Wakati swali la kweli ni ukodishaji upi wa VPN unamilikiwa na mtu, unganisha kumbukumbu ya kikao kilichothibitishwa cha seva ya VPN kwa wakati mmoja. Wakati swali ni chanzo kipi kilifika kwa msikilizaji, soma jedwali la miunganisho au kumbukumbu zinazoruhusiwa upande wa seva.
Weka thamani hizi zenye lebo tofauti katika zana yoyote ya msaada. Matokeo ya WTS yaliyokosekana yanapaswa kubaki hayapo badala ya kurudi kwenye thamani ya rejista ya kiholela kutoka kikao kingine. Andika kitambulisho cha kikao kando ya anwani, kwa sababu mtumiaji huyo anaweza kuunganisha tena na kupata thamani mpya. Jina la mteja au anwani iliyoripotiwa—hakuna hata moja ni uthibitisho wa kutosha kwa kutoa ufikiaji.