PowerShell でリモートセッションをログオフする

Marion Paul Kenneth Mendoza 2022年6月21日
PowerShell でリモートセッションをログオフする

組織の管理者として、特定のサーバーまたはワークステーションでパフォーマンスの低下が発生する可能性がある職場では一般的な問題です。

この状況は通常、複数のユーザーがマシンにリモート接続していることが原因で発生します。特に、これが共有ワークステーションの場合はそうです。ただし、リモート接続しているほとんどのユーザーは適切にログオフせず、リモートデスクトップ接続または RDP の閉じるボタンを押すだけです。

ユーザーがマシンから適切にログオフしない場合、ユーザーのプロファイルはアクティブなままになり、リソースを消費します。管理者は、ログオフ操作を実行することでこれを修正できます。

この記事では、コマンドラインと PowerShell を使用してリモートユーザーをログオフする方法について説明します。

PowerShell でリモートセッションをログオフする

プログラムでリモートセッションからログオフするのは簡単です。ただし、このユースケースでは、組み込みの PowerShell コマンドモジュールの代わりにレガシーコマンドを使用することをお勧めします。

たとえば、PowerShell モジュールの Invoke-RDUserLogoff コマンドには、ドメインに参加しているコンピュータと Windows Server 2012 R2 または 8.1 以下のオペレーティングシステムでのみ実行されるなどの制限があります。

今のところ、今日まで広く使用されているリモートユーザーをログオフするためのいくつかのレガシーコマンドに焦点を当てましょう。

logoff コマンド

logoff コマンドは、ローカルまたはリモートのサーバーまたはワークステーションでのユーザーの現在のセッションを終了します。以下のコードを使用して help コマンドを実行すると、logoff コマンドレットがセッション名または ID やサーバー名などのいくつかのパラメーターを使用していることがわかります。これらは両方とも重要です。

サンプルコード:

logoff /?

出力:

LOGOFF [sessionname | sessionid] [/SERVER:servername] [/V] [/VM]

ターゲットとするサーバーがすでにわかっている場合、そのマシンの現在のセッションをどのように知ることができますか?次に、query user コマンドまたは quser を使用します。

quser コマンドを使用したユーザーセッションのクエリ

今のところ、以下のコードスニペットを使用してローカルマシンで quser を実行してみてください。

サンプルコード:

quser

出力:

USERNAME              SESSION NAME        ID  STATE   IDLE TIME  LOGON TIME
>marion               console             1  Active      none   6/10/2022 5:56 AM

quser コマンドを実行すると、コンピューター上の現在のすべてのセッションが表示されます。ただし、実際にそのサーバーにログインせずに、リモートサーバー上の特定のユーザーのセッション ID を分離するにはどうすればよいでしょうか。

リモートコンピュータをターゲットにしながら、ローカルで quser コマンドを実行できることを忘れないでください。必要なのは、コンピューターにリモートで接続する権限を持つ管理者アカウントだけです。

この時点から、WindowsPowerShell が必要になります。

-split のような文字列操作を実行するには、以下のスニペットに PowerShell が必要です。さらに、以下の出力には、logoff コマンドのパラメーターとして必要なユーザーのセッション ID が表示されます。

サンプルコード:

((quser /server:RDP01 | ? { $_ -match "marion" }) -split ' +')[3]

出力:

1

quserlogoff などのレガシーコマンドを PowerShell で実行できることは注目に値します。したがって、これからは、インタープリターとしてコマンドプロンプトの代わりに PowerShell ターミナルを使用します。

quser および logoff コマンドを使用してユーザーをログオフする

コンピューターでリモートセッションを確立せずにユーザーのセッション ID を取得する方法がわかったので、PowerShell 内ですべてのコマンドを組み合わせることができます。例として、以下のコードスニペットに従うことができます。

Set-Alias Query-User quser
Set-Alias Logoff-User logoff

$serverName   = 'RDP01'
$userName = 'marion'

$sessionID = ((Query-User /server:$serverName | ? { $_ -match $userName }) -split ' +')[3]

Logoff-User $sessionID /server:$serverName

お気づきのとおり、quser コマンドと logoff コマンドの両方に新しいエイリアスを作成しました。この手順はオプションですが、Verb-Noun コマンド形式を使用して、PowerShell スクリプトにさらに没頭するためにこれを実行しました。

Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn