如何通过Windows命令行检索当前的用户会话ID?
在“用户”选项卡下的任务列表中,每个用户都与一个会话ID相关联。我想通过命令行检索它,以便可以将其用于远程应用程序。
如何通过Windows命令行检索当前的用户会话ID?
在“用户”选项卡下的任务列表中,每个用户都与一个会话ID相关联。我想通过命令行检索它,以便可以将其用于远程应用程序。
Answers:
这当然不是最有效的方法,但是您可以查看的结果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
tasklist
很好,因为它不需要Pro / Ent OS版本。您还可以通过过滤explorer.exe仅列出交互式会话tasklist /fi "imagename eq explorer.exe"
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%
tasklist
。
这结合了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
使用%%a
and %%b
(而不是%a
and %b
),因为它在脚本中。@
如果整个批处理文件都在下,则可能会省略@echo off
。使用初始化unknown
可以进行错误处理(检测query session
匹配的输出中是否没有行)。
练习中扩展错误处理以识别并响应输出是否存在多个匹配行query session
。
与会话名称不同,会话ID不存储在变量中,也不容易获取。我敢肯定有一个,但是我想不出一个内置的命令行工具可以做到这一点。
但是,我已经编写了一个小型的.exe文件(C#、. Net 4)来执行此操作。
它既显示会话ID,又将其作为返回码,以便您可以在各种脚本/技术中使用它。
这是基于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,请再次运行该脚本。