2011-05-10 106 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函數。

工作很好。 再次感謝。