Zein helbide ematen du Windowsek RDP saio baterako?
WTS APIak RDP saio baterako jakinarazitako bezero helbidea itzultzen du, erregistroak ez. Galdetu saio ID zuzena eta deskodetu IPv4 edo IPv6 behar bezala.
RDP saio batek bezero helbidea behar du, eta iturri begi-bistakoak ez datoz bat. CLIENTNAME ordenagailu izena ematen du, erregistroak beste saio batzuetako balioak gordetzen ditu, eta socketaren beste aldea atebide edo NAT helbidea izan daiteke, bezeroa izan beharrean. Windowsek bai ematen du saio bakoitzeko jakinarazitako bezero helbidea, baina saio zuzena eskatu eta erantzuna behar bezala deskodetu behar duzu.
Ainguratu bilaketa saio bakarrera
Hasi saioarekin, ez pertsonarekin. Windows RDP ostalari batek hainbat saio eduki ditzake kontu berarentzat, eta berriz konektatu aurretik ikusitako helbidea agian ez dator bat jada esteka aktiboarekin. Idatzi saio IDa, erabiltzailea eta behaketaren unea elkarrekin. Saio IDa APIak espero duen gakoa da, eta bi saio nahastea eragozten duen balioa da.
Ostalarian, instalatutako saio tresnek existitzen dena zerrendatzen dute; erabili administrazio ikuspegia horretarako eskubidea duzunean soilik. Egiaztatu aukeratutako IDa kontsultaren aurretik bertan, zeren berrerabilitako ID batek beste saio baten datuak itzultzen baititu.
qwinsta
Deitu WTSQuerySessionInformationW ID horretarako
Terminal Services APIak 14 informazio klaseari esker erantzuten dio galderari, WTSClientAddress. ctypes bilgarri txiki bat nahikoa da Windowsen, eta beste erabiltzaile baten hivea irakurtzea saihesten du. Beheko kodeak saio ID esplizitua hartzen du eta tokiko ostalariari galdetzen dio.
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)
Pasa berri duzun egiaztatutako saio ID osoa, eta mantendu zero zerbitzari heldulekua tokiko makinarentzat. Tratatu huts egindako deia errore gisa, helbide eza bezala beharrean, zeren biek ondorio ezberdinetara eramaten baitute. Beste erabiltzaile baten saioa kontsultatzeak Query Information baimen egokia eskatzen du, beraz exekutatu tresna baimena eman zaion kontu batekin, ad hoc pribilegioak igotzearen ordez. Itzulitako bufferra APIarena da eta askatu behar da deskodetzeak huts egiten duenean ere.
Deskodetu familia, eta gero askatu bufferra
Egitura ez da IP kate bat. Bere familia eremuak erabakitzen du nola irakurri hogei helbide byteak: IPv4 bi offsetean hasten da, eta IPv6 zero offsetean. Zehaztu gabeko helbidea bezeroak bat ere jakinarazi ez duela esan nahi du, eta hori ez da kate hutsa izatea. Remote Desktop Gateway konexioak helbidea eskuragarri ez dagoen kasu gisa dokumentatuta daude, beraz atebide baten bidezko saio batek ez du ezer erabilgarririk jakinarazten bezeroaren benetako helbideaz. Orduan korrelazioa atebidearen beraren erregistroetara joan behar du.
Inprimatu familia helbidearen ondoan arazketa egiten duzun bitartean, zeren bien arteko desadostasuna da balio sinesgarri baina oker baten ohiko arrazoia. Askatu bufferra WTSFreeMemory erabiliz finally bloke batean, salbuespen batek ez dezan galarazi.
Bereizi jakinarazitako helbidea frogatik
Jakinarazitako bezero helbidea bezeroak emandako adierazpena da, ez behaketa fidagarria. Ez da TCP kontrako aldea, ez da VPN atebidearen errentamendu taula, eta ez da bezeroaren helbide publikoa. Benetako galdera pertsona bati zein VPN errentamendu dagokion denean, korrelazioa egin VPN zerbitzariaren autentifikatutako saio erregistroarekin aldi berean. Galdera entzulearengana zein iturrik iritsi zen denean, irakurri konexio taula edo baimendutako zerbitzari aldeko erregistroak.
Eduki balio hauek etiketa bereiziekin edozein laguntza tresnatan. Falta den WTS emaitza faltan geratu behar da, beste saio bateko erregistro balio arbitrario batera itzuli beharrean. Erregistratu saio IDa helbidearen ondoan, zeren erabiltzaile berak berriz konekta daiteke eta balio berria jaso. Ez bezeroaren izena, ez jakinarazitako helbidea ez dira nahikoa froga sarbidea emateko.