簡體   English   中英

如何獲取以用戶身份運行的Windows 7應用程序的MainWindowHandle <foo> 從作為本地系統運行的服務中?

[英]How can I get the MainWindowHandle of a Windows 7 application running as user <foo> from within a service running as Local System?

我創建了一個以“本地系統”用戶身份運行的服務。 此服務使用本機互操作和CreateProcessAsUser()方法啟動並監視Silverlight瀏覽器外應用程序(以當前登錄用戶(而不是本地系統)的身份運行它)。 我能夠在生成的Process上獲得一個句柄,並執行類似Kill()的操作,但是,我知道該服務無法獲得子應用程序主窗口的句柄,因為子應用程序是以其他用戶身份運行。 我在Windows 7上運行。

我的最終目標是對Process停止響應的時間做出正確響應(即Process.Responding == false),以便我可以終止該應用程序並重新啟動它。 但是,Process.Responding需要處理主窗口的句柄(確切地說是Process.MainWindowHandle),但是,在這種情況下,Process.MainWindowHandle始終返回0。

我被困在這里。 在Win 7中,一個用戶有什么方法可以獲取以另一個用戶身份運行的進程的窗口句柄?

在此先感謝您提供的所有幫助。

不,那不可能。 出於安全原因,Windows服務與用戶模式應用程序完全隔離。 如果您可以獲取窗口的句柄,則可以操縱該窗口並與之交互,從而留下一個巨大的安全漏洞。

更多信息請點擊這里:

嚴格地說,你首先使用Windows服務,什么是壞的設計。 它不應該創建或啟動任何用戶模式的進程,也不應該以任何方式與用戶交互。 請記住,即使沒有用戶登錄,服務也會運行! 因此,他們不應該啟動應用程序。

更好的解決方案是一個簡單的后台應用程序,該后台應用程序設置為在用戶登錄時自動啟動。然后,該后台應用程序可以啟動Silverlight應用程序,監視其狀態並根據需要與之交互,因為這兩個應用程序都將在以下情況下運行:相同的本地用戶帳戶。 效果類似於服務,但沒有隔離的任何缺點。 在Visual Studio中執行此操作的最簡單方法是創建一個WinForms應用程序(或者可能是WPF應用程序,我在該領域經驗較少),該應用程序根本不顯示任何窗體/窗口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM