会话启动器

一个.NET 8 Windows控制台实用程序,用于在特定的Windows RDSH用户会话中启动可执行文件,用于并行自动化。

  • by everythingisalientome
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 everythingisalientome/SessionLauncher

使用说明

会话启动器

A.NET 8 Windows控制台实用程序,在特定的Windows RDSH(远程桌面会话主机)用户会话中启动可执行文件。由注册表用于在隔离的用户会话中运行桌面代理和MCP工具,以实现并行自动化。


项目结构

SessionLauncher/
├── SessionLauncher.csproj      # .NET 8 Windows console project
├── Program.cs                  # Entry point — session lookup + process launch
└── publish/                    # Self-contained build output
    └── SessionLauncher.exe

运作原理

  1. 接受 --user, --exe,以及 --args 作为命令行参数
  2. 呼叫 WTSEnumerateSessions 列出所有活动的Windows会话
  3. 通过匹配属于目标用户名的会话 WTSQuerySessionInformation
  4. 通过获取该会话的用户令牌 WTSQueryUserToken
  5. 通过以下方式在该会话中启动可执行文件 CreateProcessAsUser

这确保了每个进程都在其自己的隔离的Windows桌面会话中运行——记事本和其他UI自动化在该用户的会话中不可见地发生,而不是在管理会话中。

日志记录到: C:\agents\SessionLauncher\launcher.log


退出代码

代码 含义
0 成功
1 缺失 --user 或 --exe 论点
2 未找到指定用户的活动会话
3 CreateProcessAsUser 失败

使用的Win32 API

API 目的
WTSEnumerateSessions 列出所有活动的Windows会话
WTSQuerySessionInformation 获取会话的用户名
WTSQueryUserToken 获取会话的模拟令牌
CreateProcessAsUser 目标会话中的启动过程
ShowWindow / SetForegroundWindow (参考上下文)

构建

cd D:\VisualStudioWrkSpce\2022\SessionLauncher\SessionLauncher

dotnet publish -c Release -r win-x64 --self-contained true -o ./publish

输出: ./publish/SessionLauncher.exe

需要 net8.0-windows 目标框架。


跑

# Launch an exe in a specific user session
SessionLauncher.exe --user agent_user_1 --exe "C:\agents\desktop_agent\desktop_agent.exe" --args "--port 8001 --mcp-url http://localhost:5001"

# Launch MCP tool in a specific user session
SessionLauncher.exe --user agent_user_1 --exe "C:\agents\GoogleSearchMcp\GoogleSearchMcp.exe" --args "--urls http://localhost:5001"

先决条件: 目标用户必须在计算机上具有活动的RDP会话。如果会话未处于活动状态,则返回退出代码2。


部署到服务器

复制整个 publish\ 文件夹到:

C:\agents\SessionLauncher\

创建日志目录:

New-Item -ItemType Directory -Force -Path C:\agents\SessionLauncher

服务器上的先决条件

  1. 启用RDSH角色的Windows Server 2022
  2. 用户 agent_user_1, agent_user_2, agent_user_3 已创建并添加到“远程桌面用户”组
  3. 在注册表启动之前,所有3个用户都必须具有活动的RDP会话
  4. 注册表必须以管理员身份运行(需要 WTSQueryUserToken)

验证活动会话

query session

预期产量:

 SESSIONNAME       USERNAME          ID  STATE
 rdp-tcp#0         agent_user_1       2  Active
 rdp-tcp#1         agent_user_2       3  Active
 rdp-tcp#2         agent_user_3       4  Active