Windowsのコマンドライン経由で現在のユーザーセッションIDを取得するにはどうすればよいですか?
[ユーザー]タブの下のタスクリストで、各ユーザーはセッションIDに関連付けられています。これをコマンドライン経由で取得して、リモートアプリケーションで使用できるようにします。
Windowsのコマンドライン経由で現在のユーザーセッションIDを取得するにはどうすればよいですか?
[ユーザー]タブの下のタスクリストで、各ユーザーはセッションIDに関連付けられています。これをコマンドライン経由で取得して、リモートアプリケーションで使用できるようにします。
回答:
これは確かに最も効率的な方法ではありませんが、の結果を見ることができますtasklist
。実行中の各プロセスの名前とセッション番号が表示されます。ローカルでログインしている場合、「console」という名前のセッションのIDを確認します。
d:\>tasklist
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
System Idle Process 0 Services 0 24 K
System 4 Services 0 8,580 K
smss.exe 316 Services 0 1,500 K
...snip
編集:
Query Session
セッションIDを取得します:
d:\>query session
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console janedoe 1 Active
rdp-tcp 65536 Listen
tasklist
Pro / Ent OSバージョンを必要としないため、良いです。また、explorer.exeのためにフィルタリングすることでのみ、対話型セッションを一覧表示することができます-tasklist /fi "imagename eq explorer.exe"
for /f "tokens=4 delims= " %%G in ('tasklist /FI "IMAGENAME eq tasklist.exe" /NH') do SET RDP_SESSION=%%G
echo Current RDP Session ID: %RDP_SESSION%
tasklist
同時に実行されているというまれなイベントで中断することに注意してください。
これは、ゲイリーの答えとオスカーの答えの側面を組み合わせたものです。ゲイリーが述べたquery session
ように、の出力は次のようになります
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console janedoe 1 Active
rdp-tcp 65536 Listen
または、私の場合(「ユーザーの切り替え」を使用)
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console gman 1 Active
otherguy 2 Disc
(RDPをセットアップしていないので、テストできません。)おそらく、質問の目的は、現在アクティブなセッションのIDを判別することです。query session
現在のセッションのように見えるものの出力を検索することをお勧めします。
for /f "tokens=2-4" %a in ('query session') do @if "%a"=="%username%" if "%c"=="Active" echo %b
その出力の各行から2番目、3番目、及び4番目のワード(我々はUSERNAMEであることを望む、[SESSION] ID、及び状態)を代入query session
する%a
、%b
および%c
、それぞれ、次にどこラインからセッションIDを報告USERNAMEは私で、STATEはActive
です。
パラメータをquery session
とることが判明したusername
ため、上記を簡略化することができます
for /f "tokens=2-4" %a in ('query session %username%') do @if "%c"=="Active" echo %b
または
for /f "tokens=3-4" %a in ('query session %username%') do @if "%b"=="Active" echo %a
これをスクリプト(バッチファイル)で使用するには、次のように言います。
set MY_SESSION_ID=unknown
for /f "tokens=3-4" %%a in ('query session %username%') do @if "%%b"=="Active" set MY_SESSION_ID=%%a
使用%%a
して%%b
(代わりに%a
と%b
、それはスクリプトでだから)。@
バッチファイル全体がの下にある場合は、おそらく省略できます@echo off
。初期化unknown
により、エラー処理(query session
一致する出力の行がないかどうかを検出)を実行できます。エラー処理を拡張して、出力に一致する行が複数ある場合に認識して対応することはquery session
、演習として残します。
セッション名とは異なり、セッションIDは変数に保存されず、アクセスも簡単ではありません。確かにありますが、これを実行する組み込みのコマンドラインツールは考えられません。
ただし、これを行う小さな.exeファイル(C#、. Net 4)を作成しました。
セッションIDを表示するだけでなく、リターンコードとしても使用できるため、さまざまなスクリプト/テクニックで使用できます。
これは、Oscar Behのコードに基づいています。
tasklist
自身を含む特定の実行可能ファイルのすべてのインスタンスのセッションID(およびその他の情報)をレポートします。コマンドを実行すると、セッションIDが表示されます。彼のコードの唯一の潜在的な欠陥は、プログラムのインスタンスが複数ある場合に通知されず、スクリプトが誤った結果を返す可能性があることです。
ここでは、すべてのインスタンスを報告しtasklist
て、そのコマンドを実行している別のセッションがないことを確認します。
for /f "tokens=4 delims= " %%G in ('tasklist /FI "IMAGENAME eq tasklist.exe" /NH') do echo Session ID %%G
2つのセッションIDが報告されている場合は、スクリプトを再度実行してください。