web-dev-qa-db-ja.com

リモートデスクトップが切断された後、コンソールセッションを復元しますか?

リモートデスクトップセッションが切断された後、(グループポリシーなどを介して)コンソールセッションをWindows 8.1 PCに自動的に復元することは可能ですか?

RDPセッション中にコマンド「tscon1/dest:console」を実行して、自分自身を切断し、コンソールセッションを再接続できることは知っていますが、これを自動的に行うことは可能ですか?

8
SofaKng

次の内容で、restore_console.batのような名前のバッチファイルを作成します。

@echo off
set LOG_FILENAME=%TEMP%\restore_console_log.txt
echo Script executed at %TIME% > %LOG_FILENAME%
echo qwinsta: >> %LOG_FILENAME%
qwinsta >> %LOG_FILENAME%

echo Checking for pending connection... >> %LOG_FILENAME%
for /f %%i in ('qwinsta ^| findstr /r /C:"^ [ ]*[0-9][0-9]*  Disc"') do (
echo Pending connection detected, finishing. >> %LOG_FILENAME%
goto end
)

echo Checking for disconnection... >> %LOG_FILENAME%
for /f "tokens=2" %%i in ('qwinsta ^| findstr /r /I /C:"^ [ ]*[^ ][^ ]* [ ]*[0-9][0-9]*  Disc"') do (
echo Redirecting session id %%i >> %LOG_FILENAME%
tscon %%i /dest:console /v >> %LOG_FILENAME%
goto end
)

:end

タスクスケジューラで、次の設定を使用して新しいタスクを作成します。

  • 一般->ユーザーがログオンしているかどうかに関係なく実行し、最高の権限で実行します。
  • トリガー->新規->ユーザーセッションからの切断時、任意のユーザー、リモートコンピューターからの接続
  • アクション->新規->プログラムの開始->プログラム/スクリプト:<バッチファイル>
  • 他のすべてはデフォルトです。

実装に関する注意:

  • これは、findstr正規表現を介してqwinsta出力を解析することによって機能します。つまり、ここで3行目からIDを抽出します。

     SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 
    >services                                    0  Disc                        
                       ######                    2  Disc                        
     console                                     7  Conn                        
     #############...                        65536  Listen                      
     rdp-tcp                                 65537  Listen                      
    
  • 何らかの理由でスケジュールタスクが接続時と切断時に実行されるため、中央のブロックが必要です。これが発生すると、出力は次の形式になります。

     SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 
    >services                                    0  Disc                        
                       ######                    2  Disc                        
                                                 3  Disc                        
     console                                     8  Conn                        
     #############...                        65536  Listen                      
     rdp-tcp                                 65537  Listen                      
    

    したがって、4行目からパターンの行を探します。

  • ロギング情報を%TEMP%\ restore_console_log.txtにダンプします。これは必須ではありませんが、スクリプトが機能しない場合に役立ちます。ログがなければ、数行になります。

これは、単一のWindows8.1マシンで機能しました。グローバルに展開できるかどうかはわかりません。

4
Kim

@キムの答えは素晴らしいです。残念ながら、MicrosoftはWindows 10のリモート接続/切断でスケジュールされたタスクの開始を中断したようです。何をしたとしても、リモートデスクトップ経由で接続または切断するときに、タスクを実行できませんでした。

幸い、一般的なイベントでのトリガーは引き続き機能します。 リモートデスクトップ切断のイベントがどこに記録されるかについてのこの質問 私に出発点を与え、試行錯誤が正しいものを生み出しました。

ログ「Microsoft-Windows-TerminalServices-LocalSessionManager/Operational」、ソース「TerminalServices-LocalSessionManager」、イベントID「24」からトリガーを「イベント時」に変更します。 (私は当初40を推奨しました-両方とも機能するようですが、40は少しノイズが多く、切断時に複数回発生する可能性があります。24が機能しない場合は、40を試してお知らせください。)以下のスクリーンショットを参照してください。

enter image description here

1
aggieNick02

これは少し古いことは知っていますが、接続を監視し、RDPが切断された状態になったことを確認すると、コンソールセッションを復元するクイックWindowsサービスを作成できるはずです。 srvanyを利用してバッチファイルを使用してサービスとして実行する作業は少し少なくなります。qwinstaから返される値を監視するだけです。

バッチ/ srvanyをステートマシンとして実行することをお勧めします。まず、バッチファイルはRDP接続を監視し、接続が見つかるまで監視を続けます。次に、次の状態に移行し、そのRDPセッションが完了するのを待ちます。セッションが切断された(ログオフされていない)ことを検出すると、そのセッションをコンソールに復元する最終状態に移行します。最後に、RDPセッションの監視の元の状態に戻ります。

簡単だと言っているわけではありませんが、可能であるはずです。あなたの「tscon [sessionID]/dest:console」が私に多くの頭痛を救ったので、主に私は提案を提供したかった。

0
Derek