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 درج کریں، کیونکہ وہی صارف دوبارہ جڑ کر نئی قدر پا سکتا ہے۔ کلائنٹ کا نام یا رپورٹ شدہ پتہ—کوئی بھی رسائی دینے کے لیے کافی ثبوت نہیں۔

متعلقہ مضامین