这当然不是最有效的方法,但你可以看看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
```。
这结合了 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
的输出中是否有_多行匹配的行,是 留作练习。
与会话名称不同,会话ID不存储在一个变量中,而且不容易获得。我确信有一个,但我想不出一个内置的命令行工具可以做到这一点。
然而,我已经写了一个小小的.exe文件(C#,.Net 4)来实现这个功能。
它既可以显示会话ID,也可以将其作为返回代码,这样你就可以在各种脚本/技术中使用它。 MediaFire上的文件链接 [MediaFire上的文件链接]0x3& [MediaFire上的文件链接]0x3
这是基于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的报告,请再次运行脚本。