Windows RDP сессийн хувьд ямар хаяг мэдээлдэг вэ?
WTS API нэг RDP сессийн хувьд мэдээлсэн клиентийн хаягийг буцаадаг бол бүртгэл нь буцаадаггүй. Зөв сессийн ID асууж, IPv4 эсвэл IPv6-г зөв задална уу.
RDP сессэд клиентийн хаяг хэрэгтэй бөгөөд ил тод эх сурвалжууд санал нийлэхгүй байна. CLIENTNAME компьютерийн нэрийг өгдөг, бүртгэл бусад сессийн утгыг хадгалдаг, сокетын эсрэг тал нь клиент биш гарц эсвэл NAT хаяг байж болно. Windows сесс бүрт мэдээлсэн клиентийн хаягийг үнэхээр өгдөг боловч зөв сессийг асууж, хариултыг зөв задална уу.
Хайлтыг нэг сессэд бэхлэнэ үү
Хүнээс биш, сессээс эхэлнэ үү. Windows RDP хост нэг бүртгэлд хэд хэдэн сесс агуулж болох бөгөөд дахин холбогдохоос өмнө харсан хаяг идэвхтэй холбоосод тохирохгүй байж болно. Сессийн ID, хэрэглэгч, ажиглалтын цагийг хамт тэмдэглэнэ үү. Сессийн ID бол API-ийн хүлээдэг түлхүүр бөгөөд хоёр сессийг андуурахаас сэргийлдэг утга нь мөн энэ.
Хост дээр суулгасан сессийн хэрэгслүүд юу байгааг жагсаана; администраторын харагдацыг зөвхөн эрхтэй үедээ ашиглана уу. Сонгосон ID-г асуулгаас өмнө шууд баталгаажуулна уу, учир нь дахин ашигласан ID өөр сессийн өгөгдлийг буцаадаг.
qwinsta
Тухайн ID-д WTSQuerySessionInformationW дуудна уу
Terminal Services API асуултад мэдээллийн 14-р ангиар хариулдаг, WTSClientAddress. Windows дээр жижиг ctypes бүрхүүл хангалттай бөгөөд өөр хэрэглэгчийн hive уншихаас зайлсхийдэг. Доорх код тодорхой сессийн ID авч, локал хотоос асууна.
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)
Саяхан баталгаажуулсан бүхэл тоон сессийн ID-г дамжуулж, локал машинд зориулж тэг серверийн бариулыг хадгална уу. Амжилтгүй дуудлагыг байхгүй хаяг гэж бус, алдаа гэж үзнэ үү, учир нь хоёр нь өөр дүгнэлтэд хүргэдэг. Өөр хэрэглэгчийн сессийг асуухад зохих Query Information зөвшөөрөл шаардлагатай тул хэрэгслийг ad hoc эрх өсгөхийн оронд тухайн зөвшөөрөл олгогдсон бүртгэлээр ажиллуулна уу. Буцаасан буфер нь API-д хамаарах бөгөөд задалж чадаагүй ч чөлөөлөх ёстой.
Гэр бүлийг задалж, дараа нь буферийг чөлөөлнө үү
Бүтэц нь IP мөр биш. Түүний гэр бүлийн талбар хорин хаягийн байтыг хэрхэн уншихыг тодорхойлно: IPv4 хоёр шилжилтээс эхэлдэг бол IPv6 тэг шилжилтээс эхэлдэг. Тодорхойгүй хаяг нь клиент мэдээлээгүй гэсэн үг бөгөөд энэ нь хоосон мөртэй ижил биш юм. Remote Desktop Gateway холболтууд хаяг боломжгүй тохиолдол гэж баримтлагдсан тул гарцаар дамжсан сесс клиентийн бодит хаягийн талаар ямар ч ашигтай зүйл мэдээлдэггүй. Тэгвэл хамаарлыг гарцын өөрийн бүртгэл рүү шилжүүлэх ёстой.
Дибаг хийх үед гэр бүлийг хаягийн хажууд хэвлэнэ үү, учир нь хоёрын зөрүү нь найдвартай мэт боловч буруу утгын ердийн шалтгаан. Буферийг finally блокт WTSFreeMemory-ээр чөлөөлнө үү, ингэснээр үл хамаарах зүйл түүнийг гоожуулахгүй.
Мэдээлсэн хаягийг нотолгооноос тусгаарлана уу
Мэдээлсэн клиентийн хаяг нь клиентийн өгсөн мэдэгдэл бөгөөд найдвартай ажиглалт биш. Энэ нь TCP-ийн эсрэг тал биш, VPN гарцын түрээсийн хүснэгт биш, клиентийн нийтийн хаяг ч биш. Жинхэнэ асуулт аль VPN түрээс хүнд хамаарах вэ гэдэг бол тэр үед VPN серверийн баталгаажсан сессийн бүртгэлийг хамааруулна уу. Асуулт аль эх сурвалж сонсогчид хүрсэн бэ гэдэг бол холболтын хүснэгт эсвэл зөвшөөрөгдсөн серверийн талын бүртгэлийг уншина уу.
Эдгээр утгыг аль ч дэмжлэгийн хэрэгсэлд тусдаа шошготой хадгална уу. Алга болсон WTS үр дүн өөр сессийн дур зоргын бүртгэлийн утга руу буцахгүй, алга болсон хэвээр үлдэх ёстой. Хаягийн хажууд сессийн ID-г бүртгэнэ үү, учир нь ижил хэрэглэгч дахин холбогдож шинэ утга авч болно. Клиентийн нэр ч, мэдээлсэн хаяг ч хандалт олгоход хангалттай нотолгоо биш.