Miałem ten problem z zablokowanymi użytkownikami aplikacji pulpitu zdalnego. Napisałem ten skrypt Powershell, aby uruchamiał się zgodnie z zaplanowanym zadaniem, aby wylogować użytkowników, którzy przez ponad 2 minuty pokazywali się jako rozłączeni. Jedyną wymaganą edycją jest NAZWA SERWERA, którą ustawiłem, aby wykluczyć Serwer Brokera usług pulpitu zdalnego, jednak możesz wykluczyć dowolny serwer, który Ci się podoba, lub wcale.
Mój skrypt został napisany dla systemu Windows Server 2012 R2, przy okazji ...
Skrypt robi to:
- Pobiera listę wszystkich sesji użytkownika pulpitu zdalnego.
- Ignoruje wszystkie sesje, które nie mówią „STATE_DISCONNECTED”.
- Ignoruje Broker Server (lub jakikolwiek inny serwer)
- Ignoruje wszystkie sesje bez identyfikatora zunifikowanej sesji
- Ignoruje wszystkie sesje, które nie mają czasu rozłączenia
- W przypadku sesji, które mają czas rozłączenia, sprawdza bieżący czas i jeśli różnica czasu między teraz a czasem rozłączenia jest większa niż X minut (w tym przypadku 2), zabija proces logowania.
- Próbuje także wydać polecenie wylogowania (najprawdopodobniej zakończy się niepowodzeniem po zabiciu procesu winlogon).
Mi to pasuje! Mam nadzieję, że pomoże to komuś innemu! :)
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'
}
}
}
Lub jeśli wolisz wersję, którą możesz zobaczyć, co dzieje się na ekranie:
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"
}
}
}