web-dev-qa-db-ja.com

運用環境でターミナルサーバーユーザーをログオフ、切断、またはリセットできない

2008ターミナルサーバーでユーザーのセッションを切断、ログオフ、またはリセットする方法に関するアイデアを探しています(完全にロックされているため、ユーザーとしてログインできません)。これは本番環境なので、サーバーを再起動するか、システム全体で何かを行うことは、今のところ問題外です。これを助けるためのPowershellのトリックはありますか?

同じターミナルサーバー(タスクマネージャー、ターミナルサービスマネージャー、リソースモニター)から直接、切断してユーザーをログオフし、セッションをリセットし、セッションのプロセスも強制終了しようとしましたが、結果はありませんでした。

助けて!


更新:考えられる他の試みがうまくいかなかったため、サーバーを再起動することになりました。この問題については、誰かが詳細情報を持っている可能性があることを期待して、この質問を開いたままにします

19
l0c0b0x

この同じ問題を解決するために私が働いたのは、タスクマネージャーの下からロックされたアカウントで実行されているすべてのプロセスを強制終了することでした。

その後、ユーザーはアカウントで再度ログオンすることができました。

再起動は必要なく、サードパーティのソフトウェアをダウンロードする必要もありませんでした。

7
laoslady

サーバーを再起動せずにアカウントをリセットする方法を共有したいと思います。まず、サーバーへの管理者アクセス権が必要です。サーバーにアクセスするために、次のログオンオプションを使用します。mstsc/v:servername/ console/admin次に、「Windows Taks Manager」で、ユーザータブに移動し、「ログオフ」するアカウントを右クリックして、ログオフを選択します。これにより、そのアカウントで使用されていたロックされたセッションが解放されます。

6
James

簡単な答えは、管理者特権のコマンドプロンプトを実行して「Taskmgr」と入力すると、[ユーザー]タブでセッションをログオフできるようになります。昇格されたセッションでないと機能しません。

5
John N

コマンドを開始し、クエリセッションを実行し、強制終了するセッションのIDを確認してから、リセットセッションを実行します。たとえば、query sessionを使用して、セッション名rdp-tcp#1が強制終了したい名前であることがわかった場合、reset session rdp-tcp#1を実行できます。 =そしてそれを殺します。

3
grem

Windows Server 2008 R2リモートデスクトップサーバーでも同様の問題が発生しました。ユーザーセッションは、RDSマネージャーを表示すると「アクティブ」と表示されていましたが、関連するセッションID番号または接続されたデバイスが表示されていませんでした(両方とも空白でした)。

上記のトリックはすべて問題を解決しませんでした。問題のユーザーとして接続すると、ターミナルサーバーがビジー状態であり、後で再試行するか、管理者に連絡する必要があることを示すエラーメッセージが返されました。

サーバーの再起動も完了しました。

3
AdmBorkBork

Win2008R2ターミナルサーバーでも同じことが今日起こったと思います。 Sympthomsは次のとおりです。彼は単純なユーザーなので、問題の詳細な説明は期待できません。 2.ログオフ/リセットセッションを試行しました(通常、これらの場合に役立ちます)-機能しませんでした。セッションは依然として「切断」ステータスのリストでハングします。 3.そのユーザーのすべてのプロセスを強制終了しようとしました-助けにはなりませんでした。セッションは持続し、強制終了を拒否します。

解決策は-ユーザーとして接続し(彼のパスワードをリセットするか、何らかのリモートアシスタンスを使用して彼のコンピューターで何が起こるかを確認できる場合は、彼の資格情報でログインし)、ログオンウィンドウで何が起こるかを確認します。接続時に、RDPクライアントの「詳細」ボタンをクリックしました-ここにあるのは、winlogonが何か問題があり、ユーザーが「再試行/無視/ etc」ボタンをクリックするのを待っていたというエラーメッセージです。そのすべての奇妙な行動。

pS私は本当にセッションを強制終了する方法を見つけることができませんでした:(

3
Andys

Windows Server 2016でも同じ問題が発生しました。ユーザーがログインできませんでした。

そこで、次の手順を実行して、孤立したセッションを切断しました。

  1. cLIでqwinstaは、使用可能なすべてのセッション、非アクティブおよびアクティブセッションを一覧表示し、ユーザーのいない1つの切断されたセッション(スクリーンショットでは「getr。」と呼ばれます)があります。名前、ただしセッションID。

アクティブなセッションを表示して強制終了

  1. セッションID(7)が1の場合。このセッションをreset session 7(fyi:rwinstaはリセットセッションのエイリアスです)

  2. 1つのセッションで機能しましたが、次回は効果がなかったため、タスクマネージャとユーザータブを開きました。そこで、すべてのリモートデスクトップユーザーに割り当てられた1つの拡張可能なリストが見つかります。1つのリストにはユーザー名がなく、4つのタスクが実行されているだけを示しています。

  3. 私は明白なものを試しました:ユーザーのログオフ。影響なし。

ユーザーをログオフしようとしています

  1. そのため、このユーザーに割り当てられた4つのタスクを終了しようとしました。いくつかのタスク、最も重要なのはcsrss.exeを強制終了すると、システムが再起動するためです。私はそれらをスキップして、いくつかの明らかなRDPタスクを強制終了しました。

ステップ/トライ4の後、最後にクラッシュしたセッションも強制終了され、ユーザーは再度ログインできました

  1. それでも問題が解決しない場合は、- 別の質問 からこの解決策を試してください。RDPクライアントに接続したら、[詳細]ボタンをクリックします。そこでエラーが表示され、retryまたはignoreをクリックすることもできます。
2
n.r.

メモ帳でファイルを作成し、findsession.cmdという名前を付けます。コマンドQuery Session/server:servername |を配置します。/i "%1"を見つけて、ディレクトリに保存します。 resetsession.cmdという名前の別のファイルを作成し、コマンドReset Session%1/server:%2を入力して保存します。

コマンドプロンプトから、それらのファイルを保存したディレクトリに移動し、findsession username(検索しようとしているユーザーのログイン)と入力します。 Enterキーを押すと、ログインIDとセッションIDが表示されます。 「resetsession.cmd ID Servername」と入力すると、そのセッションがリセットされます。私はこれを毎日使用しており、ユーザーを見つけてセッションをリセットするのに非常に高速です。

1
Sysadmin

ロックされたリモートデスクトップアプリケーションユーザーでこの問題が発生しました。この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"
                }
             }
          }
1
Nullldata

ユーザーがalt + tabを使用してリモートデスクトップウィンドウの背後に非表示の資格情報ポップアップボックスを持たないことを確認する価値があるかもしれません。

同僚も同じ問題を抱えていました。ログオフもリセットもできず、彼のプロセスはすべて手動でシャットダウンされました。彼がFROMをリモート処理しているシステムのGUIにアクセスしようとすると、リモートセッションの背後に隠れている認証情報ボックスが見つかりました。

1
Kutrayn
  1. qwinstaを使用してセッションIDを見つけます。
  2. セッション下のすべてのプロセスを強制終了しますtaskkill /FI "SESSION eq 1" /F、qwinstaから返された終了したいセッションIDが1であると仮定します。

これはServer 2012バージョン6.2ビルド9200で機能しましたが、すべてのバージョンのWindowsで機能することを期待しています。

1
Will

同じ状況です。リモートデスクトップサービスを備えたWindows Server 2008 R2、セッションが非アクティブまたは3時間切断された後、ユーザーをログオフするようにRDP接続が設定されていて、一部のセッションがロックされたままです。リモートデスクトップマネージャーとqwinsta/quserの両方でログオフしようとしましたが、成功しませんでした。

解決方法は次のとおりです。

  1. セッションIDはqwinstaで見つけました。
  2. winlogon.exeとのハングしたセッションのquery process /ID:youridのPIDを見つけました。
  3. taskkill /f /PID yourPIDでプロセスを終了しました。

行く方法。それ以外の場合は、これが起こらないようにするための解決策を見つけたいと思います。

1
curropar

私のために働いたのは:

  • サーバーにログオンする
  • タスクマネージャーを開く
  • ユーザータブでユーザーを探します
  • 右クリックして接続し、ユーザーパスワードを入力すると、「お待ちください」画面が表示されました
  • サーバーからログオフし、ユーザーもログオフしたalt-tabを押す
1
PhDJ

この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"  

編集:
最初にこのスクリプトを使用して、「切断された」すべてのセッションをログオフし、閉じました。多くのユーザーと限られたライセンスを持つターミナルサーバーアプリケーションがいくつかあります。切断されたセッションは非常に長い間開いたままで、時には無期限に開いたままになることもありました。これにより、一部のライセンスを使用する未使用のセッションが発生し、他のユーザーは結果として接続できなくなります。

  • スケジュールされたタスクを使用してスクリプトを実行し、定期的にチェックして
    一部のサーバーでセッションを切断します。自律的に動作します
    相互作用は必要ありません。
  • Windows 2008 R2 ServerおよびWindows 2012 R2 Serverオペレーティングシステムで使用しています。
  • 切断されたセッションのみを閉じます。
  • 切断したユーザーまたはセッションで「ログ」ファイルを更新します。
1
9953-div-37

まったく同じ環境ではありませんが(2012r2があります)、Hyper-V仮想マシン管理サービス(VMMS)を再起動すると接続が解放されました。

0
user244946

あなたはいつもあなたのローカルマシンからpowershellを使用してリモートでそれをすることができました

Invoke-command -computername <servername> -Credential (get-credential) { 
    $session = ((quser | ? { $_ -match <username> }) -split ' +' )[2]
    logoff $session
} 
0
Aden

私の修正:コンピューター管理ツールを介して問題のサーバーに接続した別のネットワークサーバーで、開いているセッションで開いているすべてのファイルを右クリックして閉じたところ、mstscを介して接続できました

0
ITGal

プロセスをクリックしてすべてのユーザーからプロセスを表示する必要があります。そうすると、接続を解除できます。

リモートデスクトップセッションのホスト構成の下にセッションポリシーを作成しないのはなぜですか。一定の間隔が経過すると、切断されたセッションまたはアイドルセッションが終了します。

0
DisplayName

まだ実行中のプロセスがあり、ログオフプロセスをブロックしている可能性があります。影響を受けるユーザーの実行中のプロセスを確認します。次に、プロセスを1つずつ強制終了して、魔女が問題の原因であることを確認します。

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Runレジストリキーも確認して、必要なプロセスのみが開始されていることを確認します。 64ビットではHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Runです。

0
quentin

" Process Explorer "ツールをMicrosoftからダウンロードし、それを使用して問題を解決できます。セッションIDがあれば、それぞれのプロセスを見つけることができます。その後、ユーザーセッションが切断された場合、Process Explorerでプロセスを強制終了できます。

0
Vikram Iyer