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
quser
や logoff
などのレガシーコマンドを 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 specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn