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


26

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

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


我不确定会话ID是什么意思?
EBGreen

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


如果从批处理中调用,则为%% G;如果直接从命令行调用,则为%G

Answers:


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我打算解析此输出。谢谢!
负值

或者我可以做到。尼斯
负面的

tasklist很好,因为它不需要Pro / Ent OS版本。您还可以通过过滤explorer.exe仅列出交互式会话tasklist /fi "imagename eq explorer.exe"
shawn

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
奥斯卡的解决方案实际上对我有用,当用%G替换%% G时:/ f“ tokens = 4 delims =”“%G in('tasklist / FI” IMAGENAME eq tasklist.exe“ / NH')执行SET RDP_SESSION =%摹
帕维尔Stankowski

2
@PawełStankowski:如果从批处理文件(%%)或从控制台(%)运行它,这就是区别
Thomas Weller 2015年

请注意,这在多个用户同时运行的极少数情况下会中断tasklist
马修·伦德伯格

5

这结合了Gary的回答Oscar的回答。正如Gary所指出的,的输出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

其分配第二,第三,和第四字(其中我们希望用户名,[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

要么

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

使用%%aand %%b(而不是%aand %b),因为它在脚本中。@ 如果整个批处理文件都在下,则可能会省略@echo off。使用初始化unknown可以进行错误处理(检测query session 匹配的输出中是否没有行)。 练习中扩展错误处理以识别并响应输出是否存在多个匹配行query session


在我的实际情况下,如果有多个会话,则它们将始终具有相同的用户名。但这可能不是典型的。
马修·伦德伯格

@MatthewLundberg:STATE呢?当前会话以外的其他会话是否被标识为“活动”?
G-Man说'Resstate Monica''Feb

是的,他们会很活跃。它是服务器操作系统。
马修·伦德伯格

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

如果看到报告了两个会话ID,请再次运行该脚本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.