2011-06-29 14:17:06 +0000 2011-06-29 14:17:06 +0000
27
27

コマンドラインからセッションIDを取得するには?

windowsのコマンドラインから現在のユーザーのセッションIDを取得する方法を教えてください。

ユーザータブのタスクリストでは、各ユーザーにセッションIDが関連付けられています。リモートアプリケーションで使用できるように、コマンドラインからこれを取得したいのですが、どうすればいいですか?

回答 (5)

29
29
29
2011-06-29 14:24:34 +0000

これは確かに最も効率的な方法ではありませんが、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

Edit:

Query Session はセッション ID:

d:\>query session
 SESSIONNAME USERNAME ID STATE TYPE DEVICE
 services 0 Disc
>console janedoe 1 Active
 rdp-tcp 65536 Listen
``` を取得します。
6
6
6
2016-02-04 22:21:53 +0000

これは、 Garyさんの回答 Oscarさんの回答 の側面を組み合わせたものです。 )  おそらく質問の意図は、現在アクティブなセッションのIDを調べることだと思われます。 query session

SESSIONNAME USERNAME ID STATE TYPE DEVICE
 services 0 Disc
>console janedoe 1 Active
 rdp-tcp 65536 Listen

これは、query sessionの出力の各行からそれぞれquery session%a%b%cActiveに2番目、3番目、4番目のワード(USERNAME、[SESSION] ID、STATEであることを期待しています)を代入し、USERNAMEが私でSTATEがquery sessionの行からSESSION IDを報告しています。

username%%a パラメータを取ることが判明したので、上記は

SESSIONNAME USERNAME ID STATE TYPE DEVICE
 services 0 Disc
>console gman 1 Active
                   otherguy 2 Disc

または for /f "tokens=2-4" %a in ('query session') do @if "%a"=="%username%" if "%c"=="Active" echo %b

これをスクリプト(バッチファイル)で使うには、スクリプト内なので %%b%a を使って(%b@ の代わりに)

for /f "tokens=2-4" %a in ('query session %username%') do @if "%c"=="Active" echo %b

と言った方がいいかもしれません。   バッチファイル全体が@echo off以下であれば、おそらくunknownを省くことができるでしょう。query sessionへの初期化により、エラー処理(query sessionの出力にマッチする行がないかどうかの検出)を行うことができます。

5
5
5
2013-01-03 14:52:01 +0000
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%
2
2
2
2011-06-29 14:28:57 +0000

セッション名と違って、セッションIDは変数に格納されていないので、簡単に手に入るものではありません。あるとは思いますが、これを実行するコマンドラインツールが内蔵されているとは思えません。

しかし、これを行う小さな .exe ファイル (C#, .Net 4) を書きました。

これはセッションIDを表示するだけでなく、リターンコードとしても使用することができるので、様々なスクリプトやテクニックでこれを使用することができます。 MediaFire上のファイルへのリンク

1
1
1
2016-02-04 22:08:48 +0000

これは、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が報告されている場合は、スクリプトを再度実行してください。