仕事でPCの運用管理をしていると、リモートでメンテナンスすることが必須になります。
Unixと違ってクライアントバージョンのWindowsは、一人しかデスクトップセッションを使う事が出来ません。また、ソフトウェアパッケージをインストールしたい時や更新プログラムを入れたい時、バックグランドで別のユーザーがログインしたままになっているとインストールに失敗することがあり、こういうケースではPCを単独で使う必要があります。タスクマネージャを使用すれば、その他にログインしているユーザーを知ることは出来ますが、ログインする前に知ることは出来ないのか?
Web検索してみると、quser.exe というコマンドがあることが分かりました。
ローカルで実行するとこんな感じで表示されます。
アイドル ユーザー名 セッション名 ID 状態 時間 ログオン時刻 >user101 rdp-tcp#3 2 Active . 2019/12/30 16:28
quser.exe にもリモート発行する /SERVER オプションは付いているものの設定が必要なようで、エラーになります。
>quser /? システムにログオンしているユーザーの情報を表示します。 QUERY USER [ユーザー名 | セッション名 | セッション ID] [/SERVER:サーバー名] ユーザー名 ユーザー名を指定します。 セッション名 セッション名を指定します。 セッションID セッション ID を指定します。 /SERVER:サーバー名 照会するサーバーを指定します (既定値は現在のサーバー)。 >quser /server:win10_01 セッション名列挙エラー 0x000006BA エラー [1722]:RPC サーバーを利用できません。
幸い、Powershell からリモートでコマンドを発行する方法は、先日発見できたので、次のようにコマンドを入力することで(正しく設定が終了している)リモートWindows10へ次に用にコマンドを発行してみたところ成功。
Invoke-Command -ComputerName win10_01 -Credential $c -ScriptBlock {quser}
以下のように表示されます。
アイドル
ユーザー名 セッション名 ID 状態 時間 ログオン時刻
user101 rdp-tcp#3 2 Active 1 2019/12/30 16:28
誰もログインしていなければ、「* に対するユーザーは存在しません。」と赤文字で表示されますので、こう表示されれば、即リモートデスクトップ接続を開始できます。
アイドル時間が数時間のユーザーが見つかった場合は、こういう奴らは今PCの前に居ないって事ですから、セッションをぶった切ってしまいましょう。
Invoke-Command -ComputerName win10_01 -Credential $c -ScriptBlock {logoff 2}
logoff 2 の 「2」はセッションID番号。
仕事で logoff コマンドを発行するなら、事前にメンテナンス時間を通告してテストマシンで練習しておかないと、問答無用でコマンドを発行しようものなら禍根を残してしまいます。
logoff コマンドは使わないにしても、quser.exe コマンドはヘルプデスク屋、サービスデスク屋に便利なコマンドになりそうです。