0

我需要在远程桌面启动程序,该程序打开一个窗口并需要用户交互,但我的应用程序是一个 Windows 服务。

我正在使用 Windows 2008。我成功创建了一个应用程序,但启动程序仅会话连接鼠标、键盘,但我需要在 RDP 中启动。

现在我正在使用这些功能。

WTSEnumerateSessions (enum all sessions, here I know if RDP)
WTSQueryUserToken (Get user token)
DuplicateTokenEx ( make a primary token)
CreateProcessAsUser (run application with SI.lpDesktop = _T("winsta0\\default"))

但这只有在控制台中运行应用程序才能成功连接到键盘、鼠标、显示器,而不是 RDP。

无论如何可以帮助我吗?谢谢。

4

2 回答 2

3

因此,您尝试在机器上的特定 RDP 会话中启动 GUI 应用程序?您的想法或多或少是正确的,尽管您可能遗漏了一些内容。查看Cassia 库自动化测试源代码中的ProcessHelper 类。您可以删除许多托管垃圾以在 C++ 中使用。如果您不需要以提升的权限运行进程,您也可以省略 GetTokenInformation( ...TokenInformationClass.TokenLinkedToken... ) 废话。自 Windows XP 以来,此代码已在每个版本的 Windows 上进行了测试。

另请注意,调用 WTSQueryUserToken 需要 SE_TCB_NAME 权限(LocalSystem 帐户默认具有该权限)。

于 2011-05-13T02:38:59.793 回答
0

好的,谢谢 Dan Ports

这解决了我的问题。

问题是权限。我配置了这三个权限。

SetPrivilege(hpToken, SE_ASSIGNPRIMARYTOKEN_NAME, TRUE);
SetPrivilege(hpToken, SE_INCREASE_QUOTA_NAME, TRUE);
SetPrivilege(hpToken, SE_TCB_NAME, TRUE);

注意:我创建的 SetPrivilege 函数。

而且工作很好。再次感谢。

于 2011-05-13T23:36:06.263 回答