コマンドラインからセッションIDを取得するにはどうすればよいですか?


26

Windowsのコマンドライン経由で現在のユーザーセッションIDを取得するにはどうすればよいですか?

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


セッションIDの意味がわかりませんか?
EBGreen

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


%% Gは、バッチから呼び出す場合、%Gはコマンドラインから直接呼び出す場合

回答:


28

これは確かに最も効率的な方法ではありませんが、の結果を見ることができます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

私はコマンドライン経由でそれを取得しようとしています。

1
右、コマンドラインからtasklistと入力します。
ゲイリー

1
うーん、実際にあなたはここに何かがあるかもしれません。編集:tasklist / FI "imagename eq cmd.exe" / FO listこの出力の解析を計画しています。ありがとう!

または私はそれを行うことができます。ニース

tasklistPro / Ent OSバージョンを必要としないため、良いです。また、explorer.exeのためにフィルタリングすることでのみ、対話型セッションを一覧表示することができます-tasklist /fi "imagename eq explorer.exe"
ショーン・

5
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%

1
Oscarのソリューションは実際に私にとってはうまくいきました。%% Gを%Gに置き換えたとき:/ f "tokens = 4 delims ="%G in( 'tasklist / FI "IMAGENAME eq tasklist.exe" / NH')do SET RDP_SESSION =% G
パヴェウスタンコウスキ

2
@PawełStankowski:それをバッチファイル(%%)またはコンソール(%)から実行する場合の違い
トーマスウェラー

これは、複数のユーザーがtasklist同時に実行されているというまれなイベントで中断することに注意してください。
マシュールンドバーグ

5

これは、ゲイリーの答えオスカーの答え側面を組み合わせたものです。ゲイリーが述べた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 、演習として残します。


私の実際のケースでは、複数のセッションがある場合、それらは常に同じユーザー名を持ちます。しかし、これはおそらく典型的ではありません。
マシュールンドバーグ

@MatthewLundberg:STATEはどうですか?現在のセッション以外のセッションは「アクティブ」として識別されていますか?
G-Manが「Reinstate Monica」と言う

はい、彼らはアクティブになります。サーバーOSです。
マシュールンドバーグ

2

セッション名とは異なり、セッションIDは変数に保存されず、アクセスも簡単ではありません。確かにありますが、これを実行する組み込みのコマンドラインツールは考えられません。

ただし、これを行う小さな.exeファイル(C#、. Net 4)を作成しました。

セッションIDを表示するだけでなく、リターンコードとしても使用できるため、さまざまなスクリプト/テクニックで使用できます。

MediaFire上のファイルへのリンク


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.