잠긴 원격 데스크톱 응용 프로그램 사용자와 함께이 문제가 발생했습니다. 이 Powershell 스크립트를 작성하여 예약 된 작업을 실행하여 2 분 이상 연결이 끊어진 것으로 표시된 사용자를 로그 오프했습니다. 필요한 유일한 편집은 SERVERNAME입니다. 은 원격 데스크톱 브로커 서버를 제외하도록 설정 이지만 원하는 서버를 전혀 제외하거나 전혀 제외 할 수 없습니다.
내 스크립트는 Windows Server 2012 R2 용으로 작성되었습니다 ...
스크립트는 다음을 수행합니다.
- 모든 원격 데스크톱 사용자 세션 목록을 가져옵니다.
- "STATE_DISCONNECTED"가 아닌 세션은 무시합니다.
- 브로커 서버 (또는 다른 서버)를 무시합니다
- 통합 세션 ID가없는 세션을 무시합니다.
- 연결 끊기 시간이없는 세션을 무시합니다
- 연결 끊기 시간이있는 세션의 경우 현재 시간을 확인하고 지금과 연결 끊기 시간의 시간 차이가 X 분 (이 경우 2)보다 큰 경우 winlogon 프로세스를 종료합니다.
- 또한 로그 오프 명령을 실행하려고 시도합니다 (winlogon 프로세스가 종료 된 후 실패 할 가능성이 높습니다).
그것은 나를 위해 작동합니다! 나는 그것이 다른 누군가를 돕기를 바랍니다! :)
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"
}
}
}