Kādu adresi Windows ziņo RDP sesijai?
WTS API atgriež ziņoto klienta adresi vienai RDP sesijai, bet reģistrs to nedara. Vaicājiet pareizo sesijas ID un pareizi atšifrējiet IPv4 vai IPv6.
RDP sesijai nepieciešama klienta adrese, un acīmredzamie avoti nav vienisprātis. CLIENTNAME sniedz datora nosaukumu, reģistrā glabājas citu sesiju vērtības, un ligzdas pretējā puse var būt vārtejas vai NAT adrese, nevis klients. Windows patiešām publisko ziņoto klienta adresi katrai sesijai, taču jāvaicā pareizā sesija un pareizi jāatšifrē atbilde.
Piesaistiet meklēšanu vienai sesijai
Sāciet ar sesiju, nevis ar cilvēku. Windows RDP resursdators var uzturēt vairākas sesijas vienam kontam, un adrese, kas redzēta pirms atkārtotas savienošanās, var vairs neatbilst aktīvajam savienojumam. Pierakstiet sesijas ID, lietotāju un novērošanas laiku kopā. Sesijas ID ir atslēga, ko sagaida API, un tieši šī vērtība neļauj sajaukt divas sesijas.
Resursdatorā instalētie sesiju rīki uzskaita esošo; administratīvo skatu izmantojiet tikai tad, ja jums uz to ir tiesības. Apstipriniet izvēlēto ID tieši pirms vaicājuma, jo pārstrādāts ID atgriež citas sesijas datus.
qwinsta
Izsauciet WTSQuerySessionInformationW šim ID
Terminal Services API atbild uz jautājumu ar informācijas klasi 14, WTSClientAddress. Windows pietiek ar nelielu ctypes ietvaru, un tas izvairās no cita lietotāja hive lasīšanas. Tālāk esošais kods saņem skaidru sesijas ID un jautā vietējam resursdatoram.
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)
Nododiet tikko pārbaudīto veselo skaitļu sesijas ID un saglabājiet nulles servera rokturi vietējai mašīnai. Neizdevušos izsaukumu uzskatiet par kļūdu, nevis par neesošu adresi, jo abi noved pie atšķirīgiem secinājumiem. Cita lietotāja sesijas vaicājumam nepieciešama atbilstošā Query Information atļauja, tāpēc palaidiet rīku kontā, kuram tā piešķirta, nevis paaugstiniet tiesības ad hoc. Atgrieztais buferis pieder API un ir jāatbrīvo arī tad, ja atšifrēšana neizdodas.
Atšifrējiet saimi, pēc tam atbrīvojiet buferi
Struktūra nav IP virkne. Tās saimes lauks nosaka, kā lasīt divdesmit adreses baitus: IPv4 sākas ar divu nobīdi, bet IPv6 sākas ar nulles nobīdi. Norādītā adrese nozīmē, ka klients to nav ziņojis, un tas nav tas pats, kas tukša virkne. Remote Desktop Gateway savienojumi ir dokumentēti kā gadījums, kad adrese nav pieejama, tāpēc sesija caur vārteju neziņo neko noderīgu par klienta īsto adresi. Tad korelācijai jāpāriet uz pašas vārtejas ierakstiem.
Atkļūdošanas laikā izdrukājiet saimi blakus adresei, jo neatbilstība starp abiem ir ierastais ticamas, bet nepareizas vērtības iemesls. Atbrīvojiet buferi ar WTSFreeMemory finally blokā, lai izņēmums to neizplūdinātu.
Atdaliet ziņoto adresi no pierādījuma
Ziņotā klienta adrese ir klienta sniegts apgalvojums, nevis uzticams novērojums. Tā nav TCP pretējā puse, nav VPN vārtejas nomas tabula un nav klienta publiskā adrese. Kad īstais jautājums ir, kura VPN noma pieder cilvēkam, tajā pašā laikā korelējiet VPN servera autentificēto sesijas ierakstu. Kad jautājums ir, kurš avots sasniedza klausītāju, lasiet savienojumu tabulu vai atļautos servera puses žurnālus.
Turiet šīs vērtības atsevišķi marķētas jebkurā atbalsta rīkā. Trūkstošam WTS rezultātam jāpaliek trūkstošam, nevis jāatgriežas pie patvaļīgas citas sesijas reģistra vērtības. Reģistrējiet sesijas ID blakus adresei, jo tas pats lietotājs var atkārtoti savienoties un saņemt jaunu vērtību. Ne klienta nosaukums, ne ziņotā adrese nav pietiekams pierādījums piekļuves piešķiršanai.