এই নিবন্ধে, আমরা বর্ণনা করব কীভাবে উইন্ডোজে RDP কানেকশন লগ পাওয়া এবং অডিট করা যায়। RDP কানেকশন লগ RDS টার্মিনাল সার্ভার অ্যাডমিনিস্ট্রেটরদের জানতে দেয় কোন ব্যবহারকারী সার্ভারে কখন লগ-ইন করেছে, কোন নির্দিষ্ট RDP ব্যবহারকারী কখন লগ-ইন করেছে এবং সেশন শেষ করেছে, এবং কোন ডিভাইস (DNS নাম বা IP ঠিকানা) থেকে ব্যবহারকারী লগ-ইন করেছে।
উইন্ডোজ ইভেন্ট ভিউয়ারে RDP কানেকশন ইভেন্ট
যখন একজন ব্যবহারকারী Remote Desktop-সক্ষম বা RDS হোস্টে কানেক্ট করে, এই ইভেন্ট সম্পর্কে তথ্য Event Viewer লগে (eventvwr.msc) সংরক্ষিত হয়। RDP কানেকশনের মূল পর্যায় এবং ইভেন্ট ভিউয়ারে সম্পর্কিত ইভেন্টগুলো বিবেচনা করুন যা অ্যাডমিনিস্ট্রেটরের জন্য আগ্রহের হতে পারে:
- Network Connection (নেটওয়ার্ক কানেকশন);
- Authentication (প্রমাণীকরণ);
- Logon (লগ-ইন);
- Session Disconnect/Reconnect (সেশন ডিসকানেক্ট/রিকানেক্ট);
- Logoff (লগ-অফ)।
Network Connection — ব্যবহারকারীর RDP ক্লায়েন্ট থেকে সার্ভারের সাথে নেটওয়ার্ক কানেকশন স্থাপন। এটি EventID 1149 (Remote Desktop Services: User authentication succeeded) ইভেন্ট। যদি এই ইভেন্ট পাওয়া যায়, তার মানে এটাই নয় যে ব্যবহারকারী প্রমাণীকরণ সফল হয়েছে। এই লগ অবস্থিত "Applications and Services Logs → Microsoft → Windows → Terminal-Services-RemoteConnectionManager → Operational"। এই ইভেন্টের জন্য লগ ফিল্টার সক্ষম করুন (লগে রাইট-ক্লিক → Filter Current Log → EventId 1149)।

পাওয়ারশেল দিয়ে সব RDP কানেকশন অটেম্প্টের তালিকা পান:
$RDPAuths = Get-WinEvent -LogName 'Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational' -FilterXPath '<QueryList><Query Id="0"><Select>*[System[EventID=1149]]</Select></Query></QueryList>'
[xml[]]$xml=$RDPAuths|Foreach{$_.ToXml()}
$EventData = Foreach ($event in $xml.Event)
{ New-Object PSObject -Property @{
TimeCreated = (Get-Date ($event.System.TimeCreated.SystemTime) -Format 'yyyy-MM-dd hh:mm:ss K')
User = $event.UserData.EventXML.Param1
Domain = $event.UserData.EventXML.Param2
Client = $event.UserData.EventXML.Param3
}
} $EventData | FT

তখন আপনি এই সার্ভারে সব RDP কানেকশনের ইতিহাসসহ একটি ইভেন্ট তালিকা পাবেন। লগগুলো ব্যবহারকারীর নাম, ডোমেইন (এই কেসে Network Level Authentication ব্যবহার করা হয়েছে; যদি NLA নিষ্ক্রিয় থাকে, তবে ইভেন্ট বর্ণনা ভিন্ন দেখাবে), এবং ব্যবহারকারীর কম্পিউটারের IP ঠিকানা প্রদান করে।

Authentication দেখায় যে একটি RDP ব্যবহারকারী সার্ভারে সফলভাবে প্রমাণীকৃত হয়েছে কিনা। লগ অবস্থিত Windows → Security। তাই আপনি EventID 4624 (An account was successfully logged on) বা 4625 (An account failed to log on) ইভেন্টে আগ্রহী হতে পারেন।
ইভেন্ট বর্ণনায় LogonType মানটি লক্ষ্য করুন।
- LogonType = 10 বা 3 — যদি রিমোট ডেস্কটপ সার্ভিস লগ-ইন করার সময় নতুন সেশন তৈরি করতে ব্যবহৃত হয়;
- LogonType = 7, অর্থাৎ ব্যবহারকারী বিদ্যমান RDP সেশনে পুনরায় সংযোগ করেছে;
- LogonType = 5 – সার্ভার কনসোলে RDP কানেকশন (mstsc.exe /admin মোডে)।
RDP অথেন্টিকেশন ফেইলার ইভেন্ট ব্যবহার করে RDP ব্রুট ফোর্স আক্রমণ থেকে রক্ষা পাওয়া যায়। আপনি একটি সিম্পল পাওয়ারশেল স্ক্রিপ্ট ব্যবহার করে আক্রমণকারীর IP-কে উইন্ডোজ ডিফেন্ডার ফায়ারওলে অটোমেটিক্যালি ব্লক করতে পারেন।
এই কেসে, ব্যবহারকারীর নাম ইভেন্ট বর্ণনায় Account Name ফিল্ডে, কম্পিউটার নাম Workstation Name-এ, এবং ব্যবহারকারীর IP Source Network Address-এ থাকে।
LogonID ফিল্ডের মান লক্ষ্য করুন। এটি ব্যবহারকারীর RDP সেশনের একটি ইউনিক আইডেন্টিফায়ার যা ব্যবহারকারীর পরবর্তী কার্যকলাপ ট্র্যাক করতে সাহায্য করে। যাইহোক, যদি একটি RDP সেশন ডিসকানেক্ট হয় এবং ব্যবহারকারী সেটিতে পুনরায় সংযোগ করে, তবে ব্যবহারকারীকে একটি নতুন LogonID অ্যাসাইন হবে (যদিও RDP সেশন একই থাকে)।
সফল RDP অথেন্টিকেশন ইভেন্ট (EventID 4624) এর তালিকা পাওয়ার এই পাওয়ারশেল কমান্ড ব্যবহার করুন:
Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 4624 -and $_.Message -match 'logon type:\s+(10)\s'} | Out-GridView

Logon উইন্ডোজে RDP লগ-ইন বোঝায়। EventID 21 — এই ইভেন্ট ব্যবহারকারী সফলভাবে প্রমাণীকৃত হওয়ার পর দেখায় (Remote Desktop Services: Session logon succeeded)। এই ইভেন্টগুলো অবস্থিত "Applications and Services Logs → Microsoft → Windows → TerminalServices-LocalSessionManager → Operational"। আপনি এখানে ব্যবহারকারীর RDP সেশনের ID — Session ID পাবেন।

EventID – 21 (Remote Desktop Services: Shell start notification received) ইঙ্গিত দেয় যে এক্সপ্লোরার শেল সফলভাবে শুরু হয়েছে (ব্যবহারকারীর RDP সেশনে উইন্ডোজ ডেস্কটপ প্রদর্শিত হয়েছে)।
Session Disconnect/Reconnect — সেশন ডিসকানেকশন এবং রিকানেকশন ইভেন্টের ID ভিন্ন হয়תמשার ডিসকানেকশনের কারণের উপর নির্ভর করে (RDP সেশনের টাইমআউটের কারণে নিষ্ক্রিয়তা, ব্যবহারকারী সেশনে Disconnect অপশন সিলেক্ট করেছে, অন্য ব্যবহারকারী বা অ্যাডমিনিস্ট্রেটর দ্বারা RDP সেশন শেষ করা, ইত্যাদি)। আপনি এই ইভেন্টগুলো "Applications and Services Logs → Microsoft → Windows → TerminalServices-LocalSessionManager → Operational" আন্ডার Event Viewer-এ পাবেন। কাজের RDP Event IDগুলো বিবেচনা করুন:
- EventID – 24 (
Remote Desktop Services: Session has been disconnected) – ব্যবহারকারী RDP সেশন থেকে ডিসকানেক্ট হয়েছে; - EventID – 25 (
Remote Desktop Services: Session reconnection succeeded) – ব্যবহারকারী সার্ভারে বিদ্যমান RDP সেশনে রিকানেক্ট করেছে; - EventID – 39 (
Session <A> has been disconnected by session <B>) – ব্যবহারকারী সংশ্লিষ্ট মেনু অপশন সিলেক্ট করে (শুধু RDP ক্লায়েন্ট উইন্ডো বন্ধ করার বদলে) RDP সেশন থেকে ডিসকানেক্ট করেছে। যদি সেশন ID ভিন্ন হয়, তবে ব্যবহারকারী অন্য ব্যবহারকারী (বা অ্যাডমিনিস্ট্রেটর) দ্বারা ডিসকানেক্ট করা হয়েছে; - EventID – 40 (
Session <A> has been disconnected, reason code <B>)। এখানে ইভেন্ট বর্ণনায় ডিসকানেকশন রিজন কোড চেক করতে হবে। উদাহরণস্বরূপ:- reason code 0 (
No additional information is available) মানে ব্যবহারকারী শুধু RDP ক্লায়েন্ট উইন্ডো বন্ধ করেছে; - reason code 5 (
The client’s connection was replaced by another connection) মানে ব্যবহারকারী পূর্বের RDP সেশনে রিকানেক্ট করেছে; - reason code 11 (
User activity has initiated the disconnect) ব্যবহারকারী স্টার্ট মেনুতে Disconnect বাটনে ক্লিক করেছে।
- reason code 0 (
Windows → Security লগে EventID 4778 (A session was reconnected to a Window Station)। ব্যবহারকারী একটি RDP সেশনে রিকানেক্ট করেছে (ব্যবহারকারীকে একটি নতুন LogonID অ্যাসাইন করা হয়েছে)।
Windows → Security লগে EventID 4779 (A session was disconnected from a Window Station)। ব্যবহারকারী একটি RDP সেশন থেকে ডিসকানেক্ট হয়েছে।
Logoff ব্যবহারকারী সেশন শেষ বোঝায়। এটি EventID 23 (Remote Desktop Services: Session logoff succeeded) হিসেবে লগ হয় "Applications and Services Logs → Microsoft → Windows → TerminalServices-LocalSessionManager → Operational" আন্ডার।

একই সময় Security লগে EventID 4634 (An account was logged off) প্রদর্শিত হয়।
System লগে EventID 9009 (The Desktop Window Manager has exited with code <X>) মানে ব্যবহারকারী RDP সেশন থেকে লগ-অফ শুরু করেছে যার ফলে ইউজারের উইন্ডো এবং গ্রাফিক্যাল শেল দুটোই টার্মিনেট হয়েছে।
EventID 4647 — User-initiated logoff (ব্যবহারকারী দ্বারা শুরুকৃত লগ-অফ)।
পাওয়ারশেল দিয়ে রিমোট ডেস্কটপ লগ-ইন হিস্টরি পাওয়া
এখানে একটি সংক্ষিপ্ত পাওয়ারশেল স্ক্রিপ্ট যা বর্তমান দিনের টার্মিনাল RDS সার্ভার ইভেন্ট লগ থেকে সব RDP কানেকশনের ইতিহাস তালিকা করে। ফলাফল টেবিলে কানেকশন টাইম, ক্লায়েন্টের IP ঠিকানা (DNS কম্পিউটারনাম), এবং রিমোট ব্যবহারকারীর নাম দেখাবে (প্রয়োজনে আপনি রিপোর্টে অন্যান্য LogonTypes অন্তর্ভুক্ত করতে পারেন)।
Get-EventLog -LogName Security -after (Get-date -hour 0 -minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match 'logon type:\s+(10)\s'}| %{
(new-object -Type PSObject -Property @{
TimeGenerated = $_.TimeGenerated
ClientIP = $_.Message -replace '(?smi).*Source Network Address:\s+([^\s]+)\s+.*','$1'
UserName = $_.Message -replace '(?smi).*\s\sAccount Name:\s+([^\s]+)\s+.*','$1'
UserDomain = $_.Message -replace '(?smi).*\s\sAccount Domain:\s+([^\s]+)\s+.*','$1'
LogonType = $_.Message -replace '(?smi).*Logon Type:\s+([^\s]+)\s+.*','$1'
})
} | sort TimeGenerated -Descending | Select TimeGenerated, ClientIP `
, @{N='Username';E={'{0}\{1}' -f $_.UserDomain,$_.UserName}} `
, @{N='LogType';E={
switch ($_.LogonType) {
2 {'Interactive - local logon'}
3 {'Network connection to shared folder)'}
4 {'Batch'}
5 {'Service'}
7 {'Unlock (after screensaver)'}
8 {'NetworkCleartext'}
9 {'NewCredentials (local impersonation process under existing connection)'}
10 {'RDP'}
11 {'CachedInteractive'}
default {"LogType Not Recognised: $($_.LogonType)"}
}
}}

এই পদ্ধতিটি আপনাকে একটি স্ট্যান্ডঅ্যালোন RDSH সার্ভারে RDP কানেকশন লগ সংগ্রহ এবং পার্স করতে দেয়। আপনার RDS ফার্মে একাধিক সার্ভার থাকলে, আপনি এই স্ক্রিপ্ট দিয়ে প্রতিটি কোয়েরি করতে পারেন, অথবা Remote Desktop Connection Broker ভূমিকা সম্বলিত একটি ম্যানেজমেন্ট সার্ভার থেকে লগ পেতে পারেন।
আপনি Event Viewer থেকে RDP কানেকশন লগ CSV ফাইলে এক্সপোর্ট করতে পারেন (Excel স্প্রেডশিটে আরও বিশ্লেষণের জন্য)। Event Viewer GUI দিয়ে লগ এক্সপোর্ট করতে পারেন (ধরে নিচ্ছি Event Viewer লগ ক্লিয়ার করা নয়) বা কমান্ড প্রম্পট দিয়ে:
WEVTUtil query-events Security > c:\ps\rdp_security_log.txt
বা পাওয়ারশেল দিয়ে:
get-winevent -logname "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" | Export-Csv c:\ps\rdp_connection_log.txt -Encoding UTF8
আপনার ব্যবহারকারীরা Remote Desktop Gateway দিয়ে কর্পোরেট RDS হোস্টে কানেক্ট করলে, আপনি Microsoft-Windows-TerminalServices-Gateway লগে EventID 302 দিয়ে ব্যবহারকারী কানেকশন লগ চেক করতে পারেন। উদাহরণস্বরূপ, নিচের পাওয়ারশেল স্ক্রিপ্ট নির্দিষ্ট ব্যবহারকারীর RD Gateway-এর মাধ্যমে কানেকশন ইতিহাস প্রদর্শন করবে:
$rdpusername="b.smith"
$properties = @(
@{n='User';e={$_.Properties[0].Value}},
@{n='Source IP Adress';e={$_.Properties[1].Value}},
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='Target RDP host';e={$_.Properties[3].Value}}
)
(Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-Gateway/Operational';ID='302'} | Select-Object $properties) -match $rdpusername

Microsoft-Windows-TerminalServices-Gateway ইভেন্ট লগে নিচের RD Gateway ব্যবহারকারী কানেকশন ইভেন্টগুলো চেক করতে পারেন:
- 300 — The user NAME, on client computer DEVICE, met resource authorization policy requirements and was therefore authorized to connect to resource RDPHOST;
- 302 — The user NAME, on client computer DEVICE, connected to resource RDPHOST;
- 303 — The user NAME, on client computer DEVICE, disconnected from the following network resource: RDPHOST. Before the user disconnected, the client transferred X bytes and received X bytes. The client session duration was X seconds.
আপনার RDS হোস্টে বর্তমান রিমোট সেশন তালিকা দেখতে কমান্ড ব্যবহার করুন:
qwinsta
কমান্ডটি সেশন ID, USERNAME, এবং সেশন স্টেট (Active/Disconnect) রিটার্ন করে। এই কমান্ড কাজে আসে যখন আপনাকে শ্যাডো রিমোট ডেস্কটপ কানেকশন ব্যবহার করার সময় ব্যবহারকারীর RDP সেশন ID জানতে হয়।

নির্দিষ্ট RDP সেশনে চলমান প্রসেসের তালিকা দেখুন (সেশন ID নির্দিষ্ট করুন):
qprocess /id:5

উইন্ডোজে আউটগোइং RDP কানেকশন লগ
আপনি ক্লায়েন্ট সাইডে আউটগোইং RDP কানেকশন লগও দেখতে পারেন। সেগুলো নিচের ইভেন্ট লগে উপলব্ধ: Application and Services Logs → Microsoft → Windows → TerminalServices-ClientActiveXCore → Microsoft-Windows-TerminalServices-RDPClient → Operational।
উদাহরণস্বরূপ, EventID 1102 ঘটে যখন একজন ব্যবহারকারী একটি রিমোট উইন্ডোজ সার্ভার RDS হোস্ট বা RDP সক্ষম উইন্ডোজ ১০/১১ কম্পিউটারের সাথে কানেক্ট করে (ডেস্কটপ উইন্ডোজ এডিশনও একাধিক সিমাল্টেনিয়াস RDP কানেকশন সমর্থন করে)।
The client has initiated a multi-transport connection to the server 192.168.13.201.

নিচের RDP স্ক্রিপ্ট বর্তমান কম্পিউটারে RDP ক্লায়েন্ট কানেকশনের ইতিহাস প্রদর্শন করবে:
$properties = @(
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='LocalUser';e={$_.UserID}}
@{n='Target RDP host';e={$_.Properties[1].Value}}
)
Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-RDPClient/Operational';ID='1102'} | Select-Object $properties

স্ক্রিপ্টটি এই কম্পিউটারে RDP কানেকশন শুরুকারী ব্যবহারকারীদের SID এবং ব্যবহারকারীদের কানেক্ট করা রিমোট ডেস্কটপ হোস্টের DNS নাম/IP ঠিকানা রিটার্ন করে। আপনি SID-কে ব্যবহারকারীর নামে রূপান্তর করতে পারেন।
আপনি ব্যবহারকারীর রেজিস্ট্রিতে RDP কানেকশন ইতিহাসও চেক করতে পারেন।