2011-06-29 14:17:06 +0000 2011-06-29 14:17:06 +0000
27
27

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

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

在用户标签下的任务列表中,每个用户都有一个会话ID。我想通过命令行来获取这个ID,这样我就可以在远程应用中使用它。

答案 (5)

29
29
29
2011-06-29 14:24:34 +0000

这当然不是最有效的方法,但你可以看看tasklist的结果。它将显示每个正在运行的进程的名称和session#。如果你在本地登录,那么看看名为 “控制台 "的会话的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
  • *

Edit:

Query Session将检索会话ID:

d:\>query session
 SESSIONNAME USERNAME ID STATE TYPE DEVICE
 services 0 Disc
>console janedoe 1 Active
 rdp-tcp 65536 Listen
```。
6
6
6
2016-02-04 22:21:53 +0000

这结合了 Gary的答案 Oscar的答案.  正如Gary所指出的,query session的输出看起来像

SESSIONNAME USERNAME ID STATE TYPE DEVICE
 services 0 Disc
>console janedoe 1 Active
 rdp-tcp 65536 Listen

,或者,在我的情况下(使用 “Switch用户”)

SESSIONNAME USERNAME ID STATE TYPE DEVICE
 services 0 Disc
>console gman 1 Active
                   otherguy 2 Disc

(我没有设置RDP,所以我不能用它来测试。)  大概问题的意图是确定当前活动会话的ID。 )  大概问题的意图是确定当前活动会话的ID。   我建议从query session的输出中搜索出类似当前会话的内容:

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

它将query session输出的每一行中的第2、3、4个字(我们希望是USERNAME、[SESSION]ID和STATE)分别分配给%a%b%c,然后从USERNAME是我、STATE是Active的那一行中报告SESSION ID。

原来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

要在脚本(批处理文件)中使用,你可能想用%%a%%b(而不是%a%b)说

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

,因为它在脚本中。   如果整个批处理文件都在@之下,你可能可以不使用@echo off。初始化为unknown可以让你做错误处理(检测query session的输出中是否没有匹配的行).  扩展错误处理,以识别和反应query session的输出中是否有_多行匹配的行,是 留作练习。

5
5
5
2013-01-03 14:52:01 +0000
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%
2
2
2
2011-06-29 14:28:57 +0000

与会话名称不同,会话ID不存储在一个变量中,而且不容易获得。我确信有一个,但我想不出一个内置的命令行工具可以做到这一点。

然而,我已经写了一个小小的.exe文件(C#,.Net 4)来实现这个功能。

它既可以显示会话ID,也可以将其作为返回代码,这样你就可以在各种脚本/技术中使用它。 MediaFire上的文件链接 [MediaFire上的文件链接]0x3& [MediaFire上的文件链接]0x3

1
1
1
2016-02-04 22:08:48 +0000

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