会话启动器
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______________________________________________________________________
运作原理
- 接受
--user,--exe,以及--args作为命令行参数 - 呼叫
WTSEnumerateSessions列出所有活动的Windows会话 - 通过匹配属于目标用户名的会话
WTSQuerySessionInformation - 通过获取该会话的用户令牌
WTSQueryUserToken - 通过以下方式在该会话中启动可执行文件
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______________________________________________________________________
服务器上的先决条件
- 启用RDSH角色的Windows Server 2022
- 用户
agent_user_1,agent_user_2,agent_user_3已创建并添加到“远程桌面用户”组 - 在注册表启动之前,所有3个用户都必须具有活动的RDP会话
- 注册表必须以管理员身份运行(需要
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