मेरे पास लॉक डेस्कटॉप डेस्कटॉप एप्लिकेशन उपयोगकर्ताओं के साथ यह समस्या थी। मैंने उपयोगकर्ताओं को लॉग ऑफ करने के लिए शेड्यूल किए गए कार्य पर चलने के लिए यह Powershell स्क्रिप्ट लिखी है जो 2 मिनट से अधिक के लिए डिस्कनेक्ट हो गई है। केवल वही संपादन आवश्यक है जो SERVERNAME है जिसे मैंने दूरस्थ डेस्कटॉप ब्रोकर सर्वर को बाहर करने के लिए सेट किया है, हालाँकि आप किसी भी सर्वर को पसंद कर सकते हैं, या कोई भी नहीं।
मेरी स्क्रिप्ट विंडोज सर्वर 2012 R2 के लिए लिखी गई थी, वैसे ...
स्क्रिप्ट ऐसा करती है:
- सभी दूरस्थ डेस्कटॉप उपयोगकर्ता सत्रों की एक सूची मिलती है।
- किसी भी सत्र को अनदेखा करें जो "STATE_DISCONNECTED" नहीं कहता है।
- ब्रोकर सर्वर (या किसी अन्य सर्वर) पर ध्यान नहीं देता
- बिना किसी सत्र सत्र आईडी वाले किसी भी सत्र को अनदेखा करता है
- ऐसे किसी भी सत्र को अनदेखा करें जिसमें डिस्कनेक्ट समय नहीं है
- उन सत्रों के लिए जिनके पास एक डिस्कनेक्ट समय है, यह वर्तमान समय की जांच करता है और यदि अब और डिस्कनेक्ट समय के बीच का अंतर X मिनट से अधिक है (इस मामले में 2), तो जीत की प्रक्रिया को मारता है।
- यह एक लॉग ऑफ कमांड जारी करने का भी प्रयास करता है (यह सबसे अधिक संभावना है कि जीतलोन प्रक्रिया के मारे जाने के बाद विफल हो जाएगा)।
इससे मेरा काम बनता है! मुझे आशा है कि यह किसी और की मदद करता है! :)
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"
}
}
}