我需要在远程桌面启动程序,这个程序打开一个窗口,需要用户进行交互,但我的应用程序是一个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。
无论如何可以帮助我吗? 感谢。
答案 0 :(得分:3)
所以你试图在机器上的特定RDP会话中启动GUI应用程序?你或多或少都有正确的想法,尽管你可能会遗漏几件。请查看源代码中的ProcessHelper class以自动测试Cassia library。您可以删除大量用于C ++的托管副本。如果您不需要使用提升的权限运行进程,也可以省略GetTokenInformation(... TokenInformationClass.TokenLinkedToken ...)废话。自Windows XP以来,此代码已在Windows的每个版本上进行过测试。
另请注意,调用WTSQueryUserToken需要SE_TCB_NAME权限(默认情况下为LocalSystem帐户)。
答案 1 :(得分:0)
好的,谢谢Dan Ports
这解决了我的问题。
问题是权限。 我配置了这三个权限。
SetPrivilege(hpToken, SE_ASSIGNPRIMARYTOKEN_NAME, TRUE);
SetPrivilege(hpToken, SE_INCREASE_QUOTA_NAME, TRUE);
SetPrivilege(hpToken, SE_TCB_NAME, TRUE);
注意:我创建的SetPrivilege函数。
工作很好。 再次感谢。