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 ಅನುಮತಿ ಬೇಕು, ಆದ್ದರಿಂದ ತಾತ್ಕಾಲಿಕವಾಗಿ ಸವಲತ್ತು ಹೆಚ್ಚಿಸುವ ಬದಲು ಆ ಅನುಮತಿ ನೀಡಲಾದ ಖಾತೆಯ ಅಡಿಯಲ್ಲಿ ಪರಿಕರವನ್ನು ಚಲಾಯಿಸಿ. ಹಿಂತಿರುಗಿಸಿದ ಬಫರ್ API ಗೆ ಸೇರಿದ್ದು ಮತ್ತು ಡೀಕೋಡಿಂಗ್ ವಿಫಲವಾದರೂ ಅದನ್ನು ಬಿಡುಗಡೆ ಮಾಡಬೇಕು.
ಕುಟುಂಬವನ್ನು ಡೀಕೋಡ್ ಮಾಡಿ, ನಂತರ ಬಫರ್ ಬಿಡುಗಡೆ ಮಾಡಿ
ರಚನೆ IP ಸ್ಟ್ರಿಂಗ್ ಅಲ್ಲ. ಅದರ ಕುಟುಂಬ ಕ್ಷೇತ್ರವು ಇಪ್ಪತ್ತು ವಿಳಾಸ ಬೈಟ್ಗಳನ್ನು ಹೇಗೆ ಓದಬೇಕೆಂದು ನಿರ್ಧರಿಸುತ್ತದೆ: IPv4 ಎರಡು ಆಫ್ಸೆಟ್ನಲ್ಲಿ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ, IPv6 ಶೂನ್ಯ ಆಫ್ಸೆಟ್ನಲ್ಲಿ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ. ಅನಿರ್ದಿಷ್ಟ ವಿಳಾಸ ಎಂದರೆ ಕ್ಲೈಂಟ್ ಯಾವುದನ್ನೂ ವರದಿ ಮಾಡಿಲ್ಲ, ಇದು ಖಾಲಿ ಸ್ಟ್ರಿಂಗ್ಗೆ ಸಮಾನವಲ್ಲ. Remote Desktop Gateway ಸಂಪರ್ಕಗಳು ವಿಳಾಸ ಲಭ್ಯವಿಲ್ಲದ ಪ್ರಕರಣವೆಂದು ದಾಖಲಾಗಿವೆ, ಆದ್ದರಿಂದ ಗೇಟ್ವೇ ಮೂಲಕ ಹೋಗುವ ಸೆಷನ್ ಕ್ಲೈಂಟ್ನ ನಿಜವಾದ ವಿಳಾಸದ ಬಗ್ಗೆ ಉಪಯುಕ್ತವಾದುದನ್ನು ವರದಿ ಮಾಡುವುದಿಲ್ಲ. ಆಗ ಸಹಸಂಬಂಧವು ಗೇಟ್ವೇಯ ಸ್ವಂತ ದಾಖಲೆಗಳಿಗೆ ಹೋಗಬೇಕು.
ದೋಷನಿವಾರಣೆ ಮಾಡುವಾಗ ಕುಟುಂಬವನ್ನು ವಿಳಾಸದ ಪಕ್ಕದಲ್ಲಿ ಮುದ್ರಿಸಿ, ಏಕೆಂದರೆ ಎರಡರ ನಡುವಿನ ಅಸಂಗತಿಯೇ ನಂಬಲರ್ಹ ಆದರೆ ತಪ್ಪಾದ ಮೌಲ್ಯದ ಸಾಮಾನ್ಯ ಕಾರಣ. ಬಫರ್ ಅನ್ನು finally ಬ್ಲಾಕ್ನಲ್ಲಿ WTSFreeMemory ಮೂಲಕ ಬಿಡುಗಡೆ ಮಾಡಿ, ಇದರಿಂದ ಅಪವಾದ ಅದನ್ನು ಸೋರಿಕೆ ಮಾಡದು.
ವರದಿ ಮಾಡಿದ ವಿಳಾಸವನ್ನು ಸಾಕ್ಷ್ಯದಿಂದ ಬೇರ್ಪಡಿಸಿ
ವರದಿ ಮಾಡಿದ ಕ್ಲೈಂಟ್ ವಿಳಾಸವು ಕ್ಲೈಂಟ್ ಒದಗಿಸಿದ ಹೇಳಿಕೆ, ವಿಶ್ವಾಸಾರ್ಹ ವೀಕ್ಷಣೆ ಅಲ್ಲ. ಅದು TCP ನ ಇನ್ನೊಂದು ತುದಿಯಲ್ಲ, VPN ಗೇಟ್ವೇಯ ಲೀಸ್ ಕೋಷ್ಟಕವಲ್ಲ, ಮತ್ತು ಕ್ಲೈಂಟ್ನ ಸಾರ್ವಜನಿಕ ವಿಳಾಸವೂ ಅಲ್ಲ. ನಿಜವಾದ ಪ್ರಶ್ನೆ ಯಾವ VPN ಲೀಸ್ ಒಬ್ಬ ವ್ಯಕ್ತಿಗೆ ಸೇರಿದೆ ಎಂದಾದರೆ, ಅದೇ ಸಮಯದಲ್ಲಿ VPN ಸರ್ವರ್ನ ದೃಢೀಕೃತ ಸೆಷನ್ ದಾಖಲೆಯನ್ನು ಸಹಸಂಬಂಧಿಸಿ. ಪ್ರಶ್ನೆ ಯಾವ ಮೂಲವು ಶ್ರೋತೃವನ್ನು ತಲುಪಿತು ಎಂದಾದರೆ, ಸಂಪರ್ಕ ಕೋಷ್ಟಕ ಅಥವಾ ಅನುಮತಿಸಲಾದ ಸರ್ವರ್-ಬದಿಯ ಲಾಗ್ಗಳನ್ನು ಓದಿ.
ಯಾವುದೇ ಬೆಂಬಲ ಪರಿಕರದಲ್ಲಿ ಈ ಮೌಲ್ಯಗಳನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ಲೇಬಲ್ ಮಾಡಿ ಇರಿಸಿ. ಕಾಣೆಯಾದ WTS ಫಲಿತಾಂಶವು ಬೇರೆ ಸೆಷನ್ನಿಂದ ಬಂದ ಅನಿಯತ ರಿಜಿಸ್ಟ್ರಿ ಮೌಲ್ಯಕ್ಕೆ ಹಿಂತಿರುಗುವ ಬದಲು ಕಾಣೆಯಾಗಿಯೇ ಉಳಿಯಬೇಕು. ವಿಳಾಸದ ಪಕ್ಕದಲ್ಲಿ ಸೆಷನ್ ID ಲಾಗ್ ಮಾಡಿ, ಏಕೆಂದರೆ ಅದೇ ಬಳಕೆದಾರ ಮತ್ತೆ ಸಂಪರ್ಕಿಸಿ ಹೊಸ ಮೌಲ್ಯ ಪಡೆಯಬಹುದು. ಕ್ಲೈಂಟ್ ಹೆಸರು ಅಥವಾ ವರದಿ ಮಾಡಿದ ವಿಳಾಸ—ಯಾವುದೂ ಪ್ರವೇಶ ನೀಡಲು ಸಾಕಷ್ಟು ಸಾಕ್ಷ್ಯವಲ್ಲ.