スクリプト-リモートデスクトップセッションを切断する方法


8

コンピューター(ローカルコンピューター)上のアクティブなリモートデスクトップセッションをすべて閉じる方法を探しています。Windowsには、アクティブなセッションを確認するためのコマンド(rwinsta、qwinstaなど)がいくつか含まれていますが、情報を簡単に使用して(文字列を解析しない限り)すべてのセッションを閉じる方法がわかりません。

Powershell(またはC#、バッチ)でローカルコンピューター上のすべてのリモートデスクトップセッションを閉じる方法はありますか?

ありがとう、マーティン


コンソールではなく、アクティブなリモートセッションのみを切断するループを含めるように回答を更新しました
Kevin Kuphal

回答:


5

ドキュメント化されていない/smパラメーターquery session(バッチファイル内)を使用して、より簡単に並べ替えることができます。

FOR /f %%G IN ('query session /sm') DO tsdiscon %%G

それは良い始まりです...しかし、リモートデスクトップセッションのみを切断します。
マーティン

4

はい、コマンドラインからtsdisconを使用します。

tsdiscon n

ここで、nはセッションIDに置き換える必要があります。

セッション番号は

query session

ローカルコンピューター上のすべてのセッションを閉じたいと言ったので、それを行う順序(つまり、最後にセッションを閉じる)に注意する必要があると思います。


2

Powershell Community Extensionsを調べてみてください。これには、Get、Stop、Disconnect TerminalSessionコマンドレットが含まれます。


2

tsdisconユーティリティを使用して、セッションを切断できます。コマンドプロンプトから「クエリセッション」コマンドを使用すると、IDのリストを表示して、それぞれに対してtsdisconコマンドを発行できます。

このようなループ構造は機能するはずです

FOR /f %%G IN ('q.bat') DO tsdiscon %%G

ここで、q.batは

query session /sm | find "Active"

これにより、リモートセッションが切断され、コンソールユーザーは無視されます。


1

tsdisconを使用して、ローカルセッションまたはリモートセッションを切断できます。

Disconnects a terminal session.

TSDISCON [sessionid | sessionname] [/SERVER:servername] [/V]

  sessionid           The ID of the session.
  sessionname         The name of the session.
  /SERVER:servername  Specifies the Terminal server (default is current).
  /V                  Displays information about the actions performed.

1

TSDISCONが「ディスク」接続されたセッションを削除しないことがわかりました。

TSDISCONをログオフに置き換えました。



1

OPはかなり古くなっていることはわかっていますが、これはあなたが望んでいることです(他の誰かが同じことをまだ探している場合は、とにかく返信すると思います)。

同様に、query/reset session代わりにq/rwinsta...を使用できます。

FOR /F %%A IN (computers.txt) DO (
    FOR /f "tokens=2" %%i IN ('qwinsta /SERVER:%%A ^| find /i "disc"') DO ECHO %%i | rwinsta %%i /SERVER:%%A /V
)

1

FOR /F %A IN (c:\scripts\ps\computers.txt) DO (FOR /f "tokens=2" %i IN ('qwinsta /SERVER:%A ^| find /i "disc"') **DO if "%i" NEQ "0" ECHO %i** | rwinsta %i /SERVER:%A /V)


0

TSDisconコマンドは、ターミナルサービス(RDP)セッションを切断します。単独で使用すると、現在のセッションが切断されます。切断するセッションのセッションIDを指定できます。切断するサーバー名を指定することもできます。

詳細については、こちらをご覧ください


0

コンピュータをシャットダウンまたは再起動せずにこれを実行するかどうかは指定しませんでした。ただし、再起動またはシャットダウンを気にしない場合は、次のように呼び出すだけです。

shutdown -r -f -m \\computer_to_restart

これにより、コンピュータが強制的に再起動されます。


まあ...それはアイデアです。しかし、すべてのセッションを終了したくありません。リモートデスクトップセッションのみ。
マーティン

0

質問が非常に古く、qwinsta / query / tsdisconのないすべてのバージョン、つまりすべてのWindowsホームバージョンに対する解決策はほとんどありません。

ただし、セッションを切断するための簡単なPowerShellバージョンがあります。

$code = @'
[DllImport("wtsapi32.dll")]
static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);

[DllImport("wtsapi32.dll")]
static extern void WTSCloseServer(IntPtr hServer);

[DllImport("Wtsapi32.dll")]
static extern bool WTSDisconnectSession(System.IntPtr hServer, int SessionId, bool bWait);

public static void DisconnectSession (String ServerName, int SessionId)
{
    IntPtr serverHandle = WTSOpenServer(ServerName);
    WTSDisconnectSession(serverHandle, SessionId, true);
    WTSCloseServer(serverHandle);
}
'@

$tstType=Add-Type -name Test -MemberDefinition $code -PassThru
#$tstType::DisconnectSession("localhost", 2)

セッションIDは、たとえばで取得できますgetProcesss。(ログオフではなく)セッションを切断するには、を使用します$tstType::DisconnectSession("localhost", 2)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.