如何从命令行检索会话 ID?

Neg*_*ive 31 windows command-line

如何通过 Windows 命令行检索当前用户会话 ID?

在用户选项卡下的任务列表中,每个用户都与一个会话 ID 相关联。我想通过命令行检索它,以便我可以将它用于远程应用程序。

Gar*_*ary 34

这当然不是最有效的方式,但你可以看看tasklist. 它将显示每个正在运行的进程的名称和会话编号。如果您在本地登录,则查看名为“控制台”的会话的 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
Run Code Online (Sandbox Code Playgroud)

编辑

Query Session 将检索会话 ID:

d:\>query session
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen
Run Code Online (Sandbox Code Playgroud)

  • 没错,从命令行输入 tasklist。 (2认同)

G-M*_*ca' 9

这结合了Gary 的回答Oscar 的回答的各个方面。正如加里所指出的,输出query session看起来像

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           janedoe                   1  Active
 rdp-tcp                                 65536  Listen
Run Code Online (Sandbox Code Playgroud)

或者,就我而言(使用“切换用户”)

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           gman                      1  Active
                   otherguy                  2  Disc
Run Code Online (Sandbox Code Playgroud)

(我没有设置 RDP,所以我不能用它进行测试。)大概这个问题的目的是确定当前活动会话的 ID。我建议搜索query session 看起来像当前会话的输出:

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

该第二,第三,和第四字(其中我们希望用户名,[SESSION]标识和状态)从输出的每一行分配query session%a%b%c分别,然后从报告SESSION?ID USERNAME 是我而 STATE 是Active.

事实证明它query session需要一个username参数,所以上面可以简化为

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

或者

for /f "tokens=3-4" %a in ('query session %username%') do @if "%b"=="Active" echo %a
Run Code Online (Sandbox Code Playgroud)

要在脚本(批处理文件)中使用它,您可能想说

set MY_SESSION_ID=unknown
for /f "tokens=3-4" %%a in ('query session %username%') do @if "%%b"=="Active" set MY_SESSION_ID=%%a
Run Code Online (Sandbox Code Playgroud)

使用%%aand %%b(而不是%aand %b),因为它在脚本中。你也许可以离开了@ ,如果整批文件下@echo off。初始化unknown使您可以进行错误处理(检测query session 匹配的输出中是否没有行)。如果输出中有多个匹配行,则扩展错误处理以识别并做出反应query session 作为练习。


小智 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%
Run Code Online (Sandbox Code Playgroud)

  • 奥斯卡的解决方案实际上对我有用,当用 %G 替换 %%G 时: for /f "tokens=4 delims= " %G in ('tasklist /FI "IMAGENAME eq tasklist.exe" /NH') do SET RDP_SESSION=% G (2认同)
  • @PawełStankowski:这是从批处理文件 (%%) 或控制台 (%) 运行它的区别 (2认同)

归档时间:

查看次数:

166148 次

最近记录:

5 年,7 月 前