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

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

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

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

答案1

这当然不是最有效的方法,但您可以查看 的结果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

答案2

这结合了Gary 的回答奥斯卡的回答。正如 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

将 的每一行输出中的第 2、第 3 和第 4 个字(我们希望分别为 USERNAME、[SESSION] ID 和 STATE)分别分配给query session%a%b%c然后从 USERNAME 为 me 且 STATE 为 的行中报告 SESSION ID 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 offunknownquery session多种的输出中的匹配行query session 留作练习。

答案3

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%

答案4

这是基于 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,请再次运行该脚本。

相关内容