2008ターミナルサーバーでユーザーのセッションを切断、ログオフ、またはリセットする方法に関するアイデアを探しています(完全にロックされているため、ユーザーとしてログインできません)。これは本番環境なので、サーバーを再起動するか、システム全体で何かを行うことは、今のところ問題外です。これを助けるためのPowershellのトリックはありますか?
同じターミナルサーバー(タスクマネージャー、ターミナルサービスマネージャー、リソースモニター)から直接、切断してユーザーをログオフし、セッションをリセットし、セッションのプロセスも強制終了しようとしましたが、結果はありませんでした。
助けて!
更新:考えられる他の試みがうまくいかなかったため、サーバーを再起動することになりました。この問題については、誰かが詳細情報を持っている可能性があることを期待して、この質問を開いたままにします
この同じ問題を解決するために私が働いたのは、タスクマネージャーの下からロックされたアカウントで実行されているすべてのプロセスを強制終了することでした。
その後、ユーザーはアカウントで再度ログオンすることができました。
再起動は必要なく、サードパーティのソフトウェアをダウンロードする必要もありませんでした。
サーバーを再起動せずにアカウントをリセットする方法を共有したいと思います。まず、サーバーへの管理者アクセス権が必要です。サーバーにアクセスするために、次のログオンオプションを使用します。mstsc/v:servername/ console/admin次に、「Windows Taks Manager」で、ユーザータブに移動し、「ログオフ」するアカウントを右クリックして、ログオフを選択します。これにより、そのアカウントで使用されていたロックされたセッションが解放されます。
簡単な答えは、管理者特権のコマンドプロンプトを実行して「Taskmgr」と入力すると、[ユーザー]タブでセッションをログオフできるようになります。昇格されたセッションでないと機能しません。
コマンドを開始し、クエリセッションを実行し、強制終了するセッションのIDを確認してから、リセットセッションを実行します。たとえば、query sessionを使用して、セッション名rdp-tcp#1が強制終了したい名前であることがわかった場合、reset session rdp-tcp#1を実行できます。 =そしてそれを殺します。
Windows Server 2008 R2リモートデスクトップサーバーでも同様の問題が発生しました。ユーザーセッションは、RDSマネージャーを表示すると「アクティブ」と表示されていましたが、関連するセッションID番号または接続されたデバイスが表示されていませんでした(両方とも空白でした)。
上記のトリックはすべて問題を解決しませんでした。問題のユーザーとして接続すると、ターミナルサーバーがビジー状態であり、後で再試行するか、管理者に連絡する必要があることを示すエラーメッセージが返されました。
サーバーの再起動も完了しました。
Win2008R2ターミナルサーバーでも同じことが今日起こったと思います。 Sympthomsは次のとおりです。彼は単純なユーザーなので、問題の詳細な説明は期待できません。 2.ログオフ/リセットセッションを試行しました(通常、これらの場合に役立ちます)-機能しませんでした。セッションは依然として「切断」ステータスのリストでハングします。 3.そのユーザーのすべてのプロセスを強制終了しようとしました-助けにはなりませんでした。セッションは持続し、強制終了を拒否します。
解決策は-ユーザーとして接続し(彼のパスワードをリセットするか、何らかのリモートアシスタンスを使用して彼のコンピューターで何が起こるかを確認できる場合は、彼の資格情報でログインし)、ログオンウィンドウで何が起こるかを確認します。接続時に、RDPクライアントの「詳細」ボタンをクリックしました-ここにあるのは、winlogonが何か問題があり、ユーザーが「再試行/無視/ etc」ボタンをクリックするのを待っていたというエラーメッセージです。そのすべての奇妙な行動。
pS私は本当にセッションを強制終了する方法を見つけることができませんでした:(
Windows Server 2016でも同じ問題が発生しました。ユーザーがログインできませんでした。
そこで、次の手順を実行して、孤立したセッションを切断しました。
セッションID(7)が1の場合。このセッションをreset session 7(fyi:rwinstaはリセットセッションのエイリアスです)
1つのセッションで機能しましたが、次回は効果がなかったため、タスクマネージャとユーザータブを開きました。そこで、すべてのリモートデスクトップユーザーに割り当てられた1つの拡張可能なリストが見つかります。1つのリストにはユーザー名がなく、4つのタスクが実行されているだけを示しています。
私は明白なものを試しました:ユーザーのログオフ。影響なし。
ステップ/トライ4の後、最後にクラッシュしたセッションも強制終了され、ユーザーは再度ログインできました
メモ帳でファイルを作成し、findsession.cmdという名前を付けます。コマンドQuery Session/server:servername |を配置します。/i "%1"を見つけて、ディレクトリに保存します。 resetsession.cmdという名前の別のファイルを作成し、コマンドReset Session%1/server:%2を入力して保存します。
コマンドプロンプトから、それらのファイルを保存したディレクトリに移動し、findsession username(検索しようとしているユーザーのログイン)と入力します。 Enterキーを押すと、ログインIDとセッションIDが表示されます。 「resetsession.cmd ID Servername」と入力すると、そのセッションがリセットされます。私はこれを毎日使用しており、ユーザーを見つけてセッションをリセットするのに非常に高速です。
ロックされたリモートデスクトップアプリケーションユーザーでこの問題が発生しました。このPowershellスクリプトを作成して、スケジュールされたタスクで実行し、2分以上切断されたと表示されたユーザーをログオフしました。必要な唯一の編集は[〜#〜] servername [〜#〜]で、リモートデスクトップブローカーサーバーを除外するように設定していますが、任意のサーバーを除外することも、まったく除外しないこともできます。
ちなみに私のスクリプトはWindows Server 2012 R2用に書かれたものですが...
スクリプトはこれを行います:
わたしにはできる!それが他の誰かの役に立つことを願っています! :)
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"
}
}
}
ユーザーがalt + tabを使用してリモートデスクトップウィンドウの背後に非表示の資格情報ポップアップボックスを持たないことを確認する価値があるかもしれません。
同僚も同じ問題を抱えていました。ログオフもリセットもできず、彼のプロセスはすべて手動でシャットダウンされました。彼がFROMをリモート処理しているシステムのGUIにアクセスしようとすると、リモートセッションの背後に隠れている認証情報ボックスが見つかりました。
qwinsta
を使用してセッションIDを見つけます。taskkill /FI "SESSION eq 1" /F
、qwinstaから返された終了したいセッションIDが1であると仮定します。これはServer 2012バージョン6.2ビルド9200で機能しましたが、すべてのバージョンのWindowsで機能することを期待しています。
同じ状況です。リモートデスクトップサービスを備えたWindows Server 2008 R2、セッションが非アクティブまたは3時間切断された後、ユーザーをログオフするようにRDP接続が設定されていて、一部のセッションがロックされたままです。リモートデスクトップマネージャーとqwinsta/quserの両方でログオフしようとしましたが、成功しませんでした。
解決方法は次のとおりです。
qwinsta
で見つけました。winlogon.exe
とのハングしたセッションのquery process /ID:yourid
のPIDを見つけました。taskkill /f /PID yourPID
でプロセスを終了しました。行く方法。それ以外の場合は、これが起こらないようにするための解決策を見つけたいと思います。
私のために働いたのは:
このPower-Shellスクリプトは私にとってはうまくいき、Niceログファイルも提供します。私はそれを here。 から入手しました。他の回答に多くの前提条件があり、私にとってうまくいかなかったため、これが他の誰かの助けになることを願っています。
# .SYNOPSIS
# Checks for disconnected sessions and logs off the disconnected user sessions.
#.DESCRIPTION
# Checks for disconnected sessions and logs off the disconnected user sessions.
#.NOTES
# File Name: Logoff-DisconnectedSession.ps1
# Author : Bart Kuppens
# Version : 1.1
#.EXAMPLE
# PS > .\Logoff-DisconnectedSession.ps1
function Ensure-LogFilePath([string]$LogFilePath)
{
if (!(Test-Path -Path $LogFilePath)) {New-Item $LogFilePath -ItemType directory >> $null}
}
function Write-Log([string]$message)
{
Out-File -InputObject $message -FilePath $LogFile -Append
}
function Get-Sessions
{
$queryResults = query session
$starters = New-Object psobject -Property @{"SessionName" = 0; "UserName" = 0; "ID" = 0; "State" = 0; "Type" = 0; "Device" = 0;}
foreach ($result in $queryResults)
{
try
{
if($result.trim().substring(0, $result.trim().indexof(" ")) -eq "SESSIONNAME")
{
$starters.UserName = $result.indexof("USERNAME");
$starters.ID = $result.indexof("ID");
$starters.State = $result.indexof("STATE");
$starters.Type = $result.indexof("TYPE");
$starters.Device = $result.indexof("DEVICE");
continue;
}
New-Object psobject -Property @{
"SessionName" = $result.trim().substring(0, $result.trim().indexof(" ")).trim(">");
"Username" = $result.Substring($starters.Username, $result.IndexOf(" ", $starters.Username) - $starters.Username);
"ID" = $result.Substring($result.IndexOf(" ", $starters.Username), $starters.ID - $result.IndexOf(" ", $starters.Username) + 2).trim();
"State" = $result.Substring($starters.State, $result.IndexOf(" ", $starters.State)-$starters.State).trim();
"Type" = $result.Substring($starters.Type, $starters.Device - $starters.Type).trim();
"Device" = $result.Substring($starters.Device).trim()
}
}
catch
{
$e = $_;
Write-Log "ERROR: " + $e.PSMessageDetails
}
}
}
Ensure-LogFilePath($ENV:LOCALAPPDATA + "\DisconnectedSessions")
$LogFile = $ENV:LOCALAPPDATA + "\DisconnectedSessions\" + "sessions_" + $([DateTime]::Now.ToString('yyyyMMdd')) + ".log"
[string]$IncludeStates = '^(Disc)$'
Write-Log -Message "Disconnected Sessions CleanUp"
Write-Log -Message "============================="
$DisconnectedSessions = Get-Sessions | ? {$_.State -match $IncludeStates -and $_.UserName -ne ""} | Select ID, UserName
Write-Log -Message "Logged off sessions"
Write-Log -Message "-------------------"
foreach ($session in $DisconnectedSessions)
{
logoff $session.ID
Write-Log -Message $session.Username
}
Write-Log -Message " "
Write-Log -Message "Finished"
編集:
最初にこのスクリプトを使用して、「切断された」すべてのセッションをログオフし、閉じました。多くのユーザーと限られたライセンスを持つターミナルサーバーアプリケーションがいくつかあります。切断されたセッションは非常に長い間開いたままで、時には無期限に開いたままになることもありました。これにより、一部のライセンスを使用する未使用のセッションが発生し、他のユーザーは結果として接続できなくなります。
まったく同じ環境ではありませんが(2012r2があります)、Hyper-V仮想マシン管理サービス(VMMS)を再起動すると接続が解放されました。
あなたはいつもあなたのローカルマシンからpowershellを使用してリモートでそれをすることができました
Invoke-command -computername <servername> -Credential (get-credential) {
$session = ((quser | ? { $_ -match <username> }) -split ' +' )[2]
logoff $session
}
私の修正:コンピューター管理ツールを介して問題のサーバーに接続した別のネットワークサーバーで、開いているセッションで開いているすべてのファイルを右クリックして閉じたところ、mstscを介して接続できました
プロセスをクリックしてすべてのユーザーからプロセスを表示する必要があります。そうすると、接続を解除できます。
リモートデスクトップセッションのホスト構成の下にセッションポリシーを作成しないのはなぜですか。一定の間隔が経過すると、切断されたセッションまたはアイドルセッションが終了します。
まだ実行中のプロセスがあり、ログオフプロセスをブロックしている可能性があります。影響を受けるユーザーの実行中のプロセスを確認します。次に、プロセスを1つずつ強制終了して、魔女が問題の原因であることを確認します。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
レジストリキーも確認して、必要なプロセスのみが開始されていることを確認します。 64ビットではHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
です。
" Process Explorer "ツールをMicrosoftからダウンロードし、それを使用して問題を解決できます。セッションIDがあれば、それぞれのプロセスを見つけることができます。その後、ユーザーセッションが切断された場合、Process Explorerでプロセスを強制終了できます。