Ich hatte dieses Problem mit gesperrten Remotedesktopanwendungsbenutzern. Ich habe dieses Powershell-Skript geschrieben, um eine geplante Aufgabe auszuführen und Benutzer abzumelden, die länger als 2 Minuten als nicht verbunden angezeigt wurden. Die einzige Änderung, die erforderlich ist, ist der SERVERNAME, den ich zum Ausschließen des Remotedesktopbrokerservers festgelegt habe. Sie können jedoch jeden beliebigen oder gar keinen Server ausschließen.
Mein Skript wurde übrigens für Windows Server 2012 R2 geschrieben ...
Das Skript macht das:
- Ruft eine Liste aller Remotedesktopbenutzersitzungen ab.
- Ignoriert alle Sitzungen, die nicht "STATE_DISCONNECTED" sagen.
- Ignoriert den Broker-Server (oder einen anderen Server)
- Ignoriert alle Sitzungen ohne einheitliche Sitzungs-ID
- Ignoriert alle Sitzungen, bei denen die Verbindung nicht getrennt wurde
- Bei Sitzungen mit einer Verbindungsunterbrechungszeit wird die aktuelle Zeit überprüft. Wenn der Zeitunterschied zwischen jetzt und der Verbindungsunterbrechungszeit mehr als X Minuten beträgt (in diesem Fall 2), wird der Anmeldevorgang abgebrochen.
- Es wird auch versucht, einen Abmeldebefehl auszugeben (dies schlägt höchstwahrscheinlich fehl, nachdem der Winlogon-Prozess beendet wurde).
Für mich geht das! Ich hoffe es hilft jemand anderem! :)
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'
}
}
}
Oder wenn Sie eine Version bevorzugen, mit der Sie sehen können, was auf dem Bildschirm passiert:
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"
}
}
}