Pa gyfeiriad mae Windows yn ei adrodd ar gyfer sesiwn RDP?
Mae rhyngwyneb WTS yn dychwelyd cyfeiriad cleient a adroddwyd ar gyfer un sesiwn RDP, ond nid y gofrestr. Gofynnwch am yr ID sesiwn cywir a datgodiwch IPv4 neu IPv6 yn gywir.
Mae sesiwn RDP angen cyfeiriad cleient, ac nid yw’r ffynonellau amlwg yn cytuno. Mae CLIENTNAME yn rhoi enw cyfrifiadur, mae’r gofrestr yn dal gwerthoedd o sesiynau eraill, a gall cymar soced fod yn gyfeiriad porth neu NAT yn hytrach na’r cleient. Mae Windows yn datgelu cyfeiriad cleient a adroddwyd ar gyfer pob sesiwn, ond rhaid i chi ofyn am y sesiwn iawn a datgodio’r ateb yn gywir.
Angorwch yr ymchwiliad i un sesiwn
Dechreuwch gyda’r sesiwn, nid y person. Gall gwesteiwr RDP Windows gario sawl sesiwn ar gyfer un cyfrif, ac efallai na fydd cyfeiriad a welwyd cyn ailgysylltu yn cyfateb i’r cyswllt byw mwyach. Cofnodwch ID y sesiwn, y defnyddiwr a’r amser arsylwi gyda’i gilydd. ID y sesiwn yw’r allwedd y mae’r rhyngwyneb yn ei disgwyl, a dyna’r gwerth sy’n rhwystro dwy sesiwn rhag cael eu drysu.
Ar y gwesteiwr, mae’r offer sesiwn sydd wedi’u gosod yn rhestru’r hyn sy’n bodoli; defnyddiwch yr olwg weinyddol dim ond pan fo gennych hawl iddi. Cadarnhewch yr ID a ddewiswyd yn syth cyn yr ymholiad, oherwydd mae ID a ailgylchwyd yn dychwelyd data sesiwn arall.
qwinsta
Galwch WTSQuerySessionInformationW ar gyfer yr ID hwnnw
Mae rhyngwyneb Gwasanaethau Terfynell yn ateb y cwestiwn gyda dosbarth gwybodaeth 14, WTSClientAddress. Mae lapio ctypes bach yn ddigon ar Windows, ac mae’n osgoi darllen cwch defnyddiwr arall. Mae’r cod isod yn cymryd ID sesiwn penodol ac yn gofyn i’r gwesteiwr lleol.
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)
Trosglwyddwch yr ID sesiwn cyfanrif rydych newydd ei wirio, a chadwch y dolennydd gweinydd nwl ar gyfer y peiriant lleol. Triniwch alwad a fethodd fel gwall yn hytrach nag fel cyfeiriad absennol, oherwydd mae’r ddau yn arwain at gasgliadau gwahanol. Mae ymholi am sesiwn defnyddiwr arall angen yr hawl Query Information briodol, felly rhedegwch yr offeryn o dan gyfrif sydd wedi’i ganiatáu yn hytrach nag esgyn yn ad hoc. Mae’r byffer a ddychwelwyd yn perthyn i’r rhyngwyneb a rhaid ei ryddhau hyd yn oed pan fydd datgodio yn methu.
Datgodiwch y teulu, yna rhyddhewch y byffer
Nid llinyn IP yw’r strwythur. Mae ei faes teulu yn penderfynu sut mae’r ugain beit cyfeiriad yn cael eu darllen: mae IPv4 yn dechrau ar wrthbwyso dau, tra mae IPv6 yn dechrau ar wrthbwyso sero. Mae’r cyfeiriad heb ei nodi yn golygu na adroddodd y cleient un, nad yw’r un peth â llinyn gwag. Mae cysylltiadau Remote Desktop Gateway wedi’u dogfennu fel achos lle nad yw’r cyfeiriad ar gael, felly nid yw sesiwn trwy borth yn adrodd unrhyw beth defnyddiol am wir gyfeiriad y cleient. Yna rhaid i’r cydberthyniad symud i gofnodion y porth ei hun.
Argraffwch y teulu ochr yn ochr â’r cyfeiriad wrth ddadfygio, oherwydd anghysondeb rhwng y ddau yw’r achos arferol o werth credadwy ond anghywir. Rhyddhewch y byffer gyda WTSFreeMemory mewn bloc finally fel nad yw eithriad yn ei ollwng.
Gwahanwch y cyfeiriad a adroddwyd oddi wrth brawf
Mae cyfeiriad cleient a adroddwyd yn ddatganiad a ddarperir gan y cleient, nid yn arsylwi dibynadwy. Nid yw’n gymar TCP, nid yw’n dabl les y porth VPN, ac nid yw’n gyfeiriad cyhoeddus y cleient. Pan mai’r cwestiwn gwirioneddol yw pa les VPN sy’n perthyn i berson, cydberthynwch gofnod sesiwn dilys y gweinydd VPN ar yr un pryd. Pan mai’r cwestiwn yw pa ffynhonnell a gyrhaeddodd y gwrandawr, darllenwch y tabl cysylltiadau neu’r logiau a ganiateir ar ochr y gweinydd.
Cadwch y gwerthoedd hyn wedi’u labelu ar wahân mewn unrhyw offeryn cymorth. Dylai canlyniad WTS coll fod yn goll yn hytrach na disgyn yn ôl i werth cofrestr mympwyol o sesiwn arall. Cofnodwch ID y sesiwn wrth ymyl y cyfeiriad, oherwydd gall yr un defnyddiwr ailgysylltu a chael gwerth newydd. Nid yw enw’r cleient nac ychwaith y cyfeiriad a adroddwyd yn dystiolaeth ddigonol ar gyfer caniatáu mynediad.