我能否找到登录到另一台机器的用户的会话 ID?

我能否找到登录到另一台机器的用户的会话 ID?

我想通过命令行在同一网络上的另一台计算机上打开应用程序。这里的场景是,用户在一个大约有 20 台计算机的房间里,并且希望能够在每台计算机上启动同一个应用程序,而无需在各个屏幕上走来走去,在每台计算机上打开它。我发现我可以使用以下方法获得此操作的基本功能执行程序如下:

psexec \\[computer] -u [username] -p [password] -d -i [SessionID] [program]

对于computerusernamepasswordprogram,我很好。有谁知道我可以找出SessionID分配给网络上登录到特定机器的特定用户的方法吗?或者,有没有更好的方法来完成我想要完成的任务?

答案1

您可以使用qwinsta(或query session)工具列出所有终端服务器会话。

有些服务器允许直接远程使用它:

qwinsta/服务器远程主机

不过,在大多数情况下,你必须执行

psexec \\远程主机奎斯塔

答案2

您可以尝试电源外壳版本:

Get-Process powershell | Select-Object SessionId | Format-List

或者MSDOS批处理版本:

tasklist /FI "IMAGENAME eq tasklist.exe" /FI "USERNAME eq %USERNAME%" /FO LIST | find "Session#:"

答案3

psexec 不需要会话 ID。

答案4

使用正确的会话 ID对于在由多个不同用户访问的远程机器上充分启动一项作业来说,确实有必要。

这是我在尝试了以下组合后发现的批处理命令执行。我把所有东西都放到一个 *.bat 文件中4 个参数:(P1)用户名,(P2)服务器名称,(P3)登录名,(P4)密码。

执行后(如果成功),会话信息将简单地存储在4 个变量:(V1)会话名称,(V2)会话用户,(V3)会话ID,(V4)会话状态。

该批次设计用于偏僻的信息访问,但可以轻松适应当地的用法。

@echo off 

REM This program gets remote session info on a given server, for a given user.
REM It needs 4 parameters: UserName, ServerName, Login, Password

REM For a local session, simply replace the 'psexec \\...' command parsed by the 'for'
REM loop with: 'query session ^| find /i "%UserName%"'
REM In that case, only the UserName parameter is necessary to call this batch.

set UserName=%1
set ServerName=%2
set Login=%3
set Password=%4

set SessionName=
set SessionUser=
set SessionId=
set SessionState=

for /f "tokens=1,2,3,4 delims=^> " %%a in ('psexec \\%ServerName% -u %Login% -p %Password% query session ^| find /i "%UserName%"') do (

  REM Test iterator because a disconnected session may no longer have a name!

  if /I "%%b"=="%UserName%" (
    set SessionName=%%a
    set SessionUser=%%b
    set SessionId=%%c
    set SessionState=%%d
  )

  if /I "%%a"=="%UserName%" (
    set SessionName=[unknown]
    set SessionUser=%%a
    set SessionId=%%b
    set SessionState=%%c
  )
)

echo Session info:
echo - Name:  %SessionName%
echo - User:  %SessionUser%
echo - ID:    %SessionId%
echo - State: %SessionState%

笔记:

  • 循环分隔符是“>”和“空格”。这是因为“查询会话”命令输出包含“>”来指示目标机器上的活动会话。我必须找到一种方法让循环忽略这个麻烦的字符,因为它通常被解释为重定向到文件。
  • 我主动忽略了这次会议类型设备输出。我相信最终可以使用 %%e 和 %%f 添加它们,以便在需要时在循环中提供另外 2 个变量。
  • 如批处理注释中所述,要在当地的机器上你不应该使用'psexec \\...'调用,但是:‘查询会话 ^| find /i “%UserName%”’相反。在这种情况下,仅限参数 P1是需要的。

相关内容