Minkä osoitteen Windows ilmoittaa RDP-istunnolle?
WTS-rajapinta palauttaa ilmoitetun asiakasosoitteen yhdelle RDP-istunnolle, eikä rekisteri tee niin. Kysy oikeaa istuntotunnusta ja pura IPv4 tai IPv6 oikein.
RDP-istunto tarvitsee asiakasosoitteen, ja ilmeiset lähteet ovat eri mieltä. CLIENTNAME antaa tietokoneen nimen, rekisteri sisältää arvoja muista istunnoista, ja pistokkeen vastapää voi olla yhdyskäytävän tai NATin osoite asiakkaan sijaan. Windows kyllä tarjoaa ilmoitetun asiakasosoitteen istuntokohtaisesti, mutta sinun on kysyttävä oikeaa istuntoa ja purettava vastaus oikein.
Kiinnitä haku yhteen istuntoon
Aloita istunnosta, älä henkilöstä. Windows RDP -isäntä voi kantaa useita istuntoja yhdelle tilille, eikä ennen uudelleenyhdistämistä nähty osoite välttämättä vastaa enää elävää yhteyttä. Kirjaa istuntotunnus, käyttäjä ja havaintoaika yhteen. Istuntotunnus on avain, jota rajapinta odottaa, ja juuri se arvo estää kahden istunnon sekoittumisen.
Isännällä asennetut istuntotyökalut listaavat olemassa olevat; käytä hallintanäkymää vain kun sinulla on siihen oikeus. Vahvista valittu tunnus välittömästi ennen kyselyä, koska uudelleen käytetty tunnus palauttaa toisen istunnon tiedot.
qwinsta
Kutsu WTSQuerySessionInformationW kyseiselle tunnukselle
Terminal Services -rajapinta vastaa kysymykseen tietoluokalla 14, WTSClientAddress. Pieni ctypes-kääre riittää Windowsissa, ja se välttää toisen käyttäjän hive-tietueen lukemisen. Alla oleva koodi ottaa eksplisiittisen istuntotunnuksen ja kysyy paikalliselta isännältä.
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)
Välitä juuri vahvistamasi kokonaislukumuotoinen istuntotunnus ja pidä nolla-palvelinkahva paikalliselle koneelle. Käsittele epäonnistunutta kutsua virheenä äläkä puuttuvana osoitteena, koska ne johtavat erilaisiin johtopäätöksiin. Toisen käyttäjän istunnon kysely vaatii asianmukaisen Query Information -oikeuden, joten aja työkalu tilillä, jolle se on myönnetty, sen sijaan että korottaisit oikeuksia ad hoc. Palautettu puskuri kuuluu rajapinnalle ja on vapautettava myös silloin, kun purku epäonnistuu.
Pura perhe ja vapauta sitten puskuri
Rakenne ei ole IP-merkkijono. Sen perhe-kenttä päättää, miten kaksikymmentä osoitebittiä luetaan: IPv4 alkaa siirtymästä kaksi, kun taas IPv6 alkaa siirtymästä nolla. Määrittämätön osoite tarkoittaa, että asiakas ei ilmoittanut yhtään, mikä ei ole sama asia kuin tyhjä merkkijono. Remote Desktop Gateway -yhteydet on dokumentoitu tapauksena, jossa osoite ei ole saatavilla, joten yhdyskäytävän kautta kulkeva istunto ei ilmoita mitään hyödyllistä asiakkaan todellisesta osoitteesta. Silloin korrelaatio on siirrettävä yhdyskäytävän omiin tietueisiin.
Tulosta perhe osoitteen viereen vianetsinnän aikana, koska näiden kahden epäsuhta on tavallinen syy uskottavaan mutta väärään arvoon. Vapauta puskuri komennolla WTSFreeMemory finally-lohkossa, jotta poikkeus ei vuoda sitä.
Erota ilmoitettu osoite todisteesta
Ilmoitettu asiakasosoite on asiakkaan antama väite, ei luotettava havainto. Se ei ole TCP-vastapää, ei VPN-yhdyskäytävän vuokrataulukko eikä asiakkaan julkinen osoite. Kun todellinen kysymys on, mikä VPN-vuokra kuuluu henkilölle, korreloi VPN-palvelimen todennettu istuntotietue samaan aikaan. Kun kysymys on, mikä lähde saavutti kuuntelijan, lue yhteystaulukko tai sallitut palvelinpuolen lokit.
Pidä nämä arvot erikseen merkittyinä missä tahansa tukityökalussa. Puuttuvan WTS-tuloksen pitäisi jäädä puuttuvaksi sen sijaan, että se korvataan toisen istunnon mielivaltaisella rekisteriarvolla. Kirjaa istuntotunnus osoitteen viereen, koska sama käyttäjä voi yhdistää uudelleen ja saada uuden arvon. Eivät asiakkaan nimi eivätkä ilmoitettu osoite ole riittävä todiste pääsyn myöntämiselle.