2011-05-10 213 views
0

我需要在远程桌面启动程序,该程序打开一个窗口并需要用户进行交互,但我的应用程序是一个windows服务。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运行应用程序的成功。

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

回答

3

所以你试图在机器上的特定RDP会话中启动GUI应用程序?你有正确的想法,或多或少,但你可能会缺少几件。看看Cassia library的自动化测试源中的ProcessHelper class。你可以删除很多用于C++的管理信息。如果您不需要使用提升的权限运行进程,您也可以省略GetTokenInformation(... TokenInformationClass.TokenLinkedToken ...)废话。自Windows XP以来,此代码已在每个版本的Windows上进行过测试。

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

+0

...挑剔,我知道:但是,拥有特权并使其活跃仍然是两回事。仍然,为好的指针+1。 – 0xC0000022L 2011-05-13 03:15:50

+0

是的。我编辑了答案来澄清这一点。 – 2011-07-13 11:40:47

0

好的,谢谢丹端口

这解决了我的问题。

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

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

注意:我创建的SetPrivilege函数。

工作很好。 再次感谢。