![我能否找到登录到另一台机器的用户的会话 ID?](https://linux22.com/image/1234376/%E6%88%91%E8%83%BD%E5%90%A6%E6%89%BE%E5%88%B0%E7%99%BB%E5%BD%95%E5%88%B0%E5%8F%A6%E4%B8%80%E5%8F%B0%E6%9C%BA%E5%99%A8%E7%9A%84%E7%94%A8%E6%88%B7%E7%9A%84%E4%BC%9A%E8%AF%9D%20ID%EF%BC%9F.png)
我想通过命令行在同一网络上的另一台计算机上打开应用程序。这里的场景是,用户在一个大约有 20 台计算机的房间里,并且希望能够在每台计算机上启动同一个应用程序,而无需在各个屏幕上走来走去,在每台计算机上打开它。我发现我可以使用以下方法获得此操作的基本功能执行程序如下:
psexec \\[computer] -u [username] -p [password] -d -i [SessionID] [program]
对于computer
、username
、password
和program
,我很好。有谁知道我可以找出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是需要的。