2009-06-04 131 views
8

當我運行一個服務以LocalSystem賬戶,我可以使用下面的代碼在當前的登錄帳號來啓動GUI程序:如何在Windows服務中啓動GUI程序?

WTSGetActiveConsoleSessionId-> WTSQueryUserToken-> CreateProcessAsUser

然而,當我運行該服務爲我的個人帳戶,GUI程序不會顯示。不過,我可以在任務管理器中看到它。

當我的個人帳戶下運行服務時,如何啓動GUI程序?

回答

2

John和jdigital都是對的 - 根據我的理解,服務通常可以有桌面訪問(您必須使用localsystem)或網絡訪問(您需要指定一個帳戶來運行)。

您需要將應用程序分成兩部分,一部分與桌面交互,另一部分通過網絡交談。然後這兩個部分可以相互通話以將信息傳遞給最終用戶。

0

這一切都與我相信的權限有關。

LocalSystem有足夠的權限模擬當前用戶,但您的帳戶沒有。

您必須通過提示憑據或連接到以LocalSystem身份運行的助手服務來找出將權限擴展到服務的方法。

(你爲什麼想與您的帳戶,而不是本地系統上運行?)

我敢肯定有更透徹的答案,與在的和這樣做的出來的問題,但在較高的水平我認爲這是問題。

+0

感謝John,原因有兩個: 1)本地系統沒有權限訪問Vista中的網絡共享文件夾 2)本地系統服務生成的所有文件歸「管理員」所有。我想要我的個人帳戶擁有的文件。 – trudger 2009-06-04 04:04:04

0

您可能在錯誤的窗口站或桌面上運行。看到這個Microsoft reference on Window Stations and Desktops

+0

該服務正在運行我的個人帳戶,我目前登錄。我剛剛檢查,該程序正在運行,但沒有顯示。 – trudger 2009-06-04 05:20:18

+0

如果您查看鏈接,您會發現這不是權限問題。 Microsoft使用Window Stations和Desktops來提供不同級別的進程隔離。有很多方法可以解決這個問題,比如SetProcessWindowStation和SwitchDesktop,但是將應用程序分成兩部分是通常推薦的解決方案。 – jdigital 2009-06-04 19:41:38

+0

是的,客戶/服務器模式是我打算做的。它會解決這個問題。但奇怪的是,雖然服務是由我的個人帳戶運行的,但它生成的文件由「管理員」擁有,而不是我的帳戶。您可以在「文件屬性 - >詳細信息 - >所有者」中查看此屬性。它不應該由我的帳戶擁有? – trudger 2009-06-05 02:02:22

0

我相信你試圖做的事情可能被認爲是一個安全漏洞。在某些情況下也不太可能。我認爲jdigital是正確的,它與窗口站有關,並試圖訪問當前的用戶窗口站,它是桌面。當您處於有多個當前窗口站的終端服務服務器之下時,這會很困惑。微軟真的不希望你得到你想要的東西,而且每次發佈Windows都會讓它變得更加困難。

我認爲你最好的選擇是從另一個角度解決問題,並創建一個用戶運行的GUI應用程序(手動或自動登錄)並與你的服務進行通信。

相關問題