লকড রিমোট ডেস্কটপ অ্যাপ্লিকেশন ব্যবহারকারীদের সাথে আমার এই সমস্যাটি ছিল। আমি এই পাওয়ারশেল স্ক্রিপ্টটি 2 মিনিটের বেশি সংযোগ বিচ্ছিন্ন হিসাবে দেখানো ব্যবহারকারীদের লগ অফ করতে একটি নির্ধারিত টাস্কে চালানোর জন্য লিখেছিলাম। কেবলমাত্র সম্পাদনাটি হ'ল SERVERNAME যা আমি রিমোট ডেস্কটপ ব্রোকার সার্ভার বাদ দিতে সেট করেছি, তবে আপনি নিজের পছন্দ মতো কোনও সার্ভার বা একেবারেই বাদ দিতে পারবেন না।
আমার স্ক্রিপ্টটি উইন্ডোজ সার্ভার 2012 আর 2 এর জন্য লিখেছিল, যাইহোক ...
স্ক্রিপ্ট এটি করে:
- সমস্ত রিমোট ডেস্কটপ ব্যবহারকারী সেশনের একটি তালিকা পান ets
- "STATE_DISCONNECTED" না বলে এমন কোনও সেশন উপেক্ষা করে।
- ব্রোকার সার্ভার (বা অন্য কোনও সার্ভার) উপেক্ষা করে
- ইউনিফাইড সেশন আইডির সাথে কোনও সেশন উপেক্ষা করে
- সংযোগের সময় নেই এমন কোনও সেশন উপেক্ষা করে
- সংযোগগুলির সাথে সংযোগ বিচ্ছিন্ন করার সময়গুলির জন্য, এটি বর্তমান সময়টি পরীক্ষা করে এবং যদি এখন এবং সংযোগ বিচ্ছিন্ন করার সময়টির পার্থক্যটি এক্স মিনিটেরও বেশি হয় (এই ক্ষেত্রে ২) তবে উইনলগন প্রক্রিয়াটি হ্রাস করে।
- এটি লগ অফ কমান্ড জারি করার চেষ্টা করে (উইনলগন প্রক্রিয়াটি হত্যার পরে এটি সম্ভবত ব্যর্থ হবে)।
এটা আমার জন্য কাজ করে! আমি আশা করি এটি অন্য কাউকে সাহায্য করবে! :)
CLS
$RD = Get-RDUserSession | select ServerName, UserName, SessionState, DisconnectTime, UnifiedSessionId, SessionId #Get details about the sessions
foreach ($item in $RD) {
$UsessionID = $item.UnifiedSessionId -as [int]
$sessionID = $item.SessionId -as [int]
if ($item.SessionState -eq "STATE_DISCONNECTED" -and $item.ServerName -ne "SERVERNAME" -and $item.DisconnectTime -ne $null -and $item.UnifiedSessionId -ne $null){
$TimeDiff = New-TimeSpan -start $item.DisconnectTime -end (Get-Date) #check time difference between disconnect time and now. If time is greater than 2 minutes....
if ($TimeDiff.Minutes -gt 2) {
#Kill winlogon session for the user
Get-WmiObject -ComputerName $item.Servername -query "select * from win32_process where name='winlogon.exe'" | Where-Object {$_.SessionId -eq $SessionId} | %{$_.terminate()}
#Log off user if session still exists (will fail if user kicked)
Invoke-RDUserLogoff -HostServer $item.ServerName -UnifiedSessionID $UsessionID -Force -erroraction 'silentlycontinue'
}
}
}
বা আপনি যদি এমন কোনও সংস্করণ পছন্দ করেন যা আপনি পর্দায় কী ঘটছে তা দেখতে পাচ্ছেন:
CLS
$RD = Get-RDUserSession | select ServerName, UserName, SessionState, DisconnectTime, UnifiedSessionId, SessionId
foreach ($item in $RD) {
$UsessionID = $item.UnifiedSessionId -as [int]
$sessionID = $item.SessionId -as [int]
if ($item.SessionState -eq "STATE_DISCONNECTED" -and $item.ServerName -ne "SERVERNAME" -and $item.DisconnectTime -ne $null -and $item.UnifiedSessionId -ne $null){
#On Screen Output
write-host " Name : " $Item.UserName -ForegroundColor "yellow" -NoNewline
write-host " Unified Session Id : " $UsessionID -ForegroundColor "darkcyan" -NoNewline
write-host " User Session Id : " $sessionID -ForegroundColor "darkyellow" -NoNewline
write-host " Session State : " $item.SessionState -ForegroundColor "magenta" -NoNewline
write-host " Server : " $item.ServerName -ForegroundColor "cyan" -NoNewline
write-host " Disconnect Time : " $item.DisconnectTime -ForegroundColor "gray"
#End On Screen Output
$TimeDiff = New-TimeSpan -start $item.DisconnectTime -end (Get-Date)
if ($TimeDiff.Minutes -lt 2) {
write-host " Disconnected for less than 2 minutes" -ForegroundColor "Green"}
else {
write-host " Disconnected for more than 2 minutes" -ForegroundColor "Red" -BackgroundColor "darkyellow"
write-host " Killing session : " $item.ServerName " ID : " $UsessionID $item.UserName -ForegroundColor "Red"
#Kill Process "Winlogon.exe" for the user (this should kill the session)
Get-WmiObject -ComputerName $item.Servername -query "select * from win32_process where name='winlogon.exe'" | Where-Object {$_.SessionId -eq $SessionId} | %{$_.terminate()}
#Logout User (if session still exists)
Invoke-RDUserLogoff -HostServer $item.ServerName -UnifiedSessionID $UsessionID -Force -erroraction 'silentlycontinue'
Write-host " Done! " -ForegroundColor "Green" -BackgroundColor "blue"
}
}
}