2010-09-22 74 views
6

我有一個運行並顯示托盤圖標的C#應用​​程序。我有一個安裝程序,用於安裝後啓動應用程序的托盤應用程序。安裝程序需要管理員權限,而托盤圖標必須以普通權限運行。我的安裝程序目前打破了這一點 - 當安裝的托盤應用程序啓動時,它從安裝程序進程繼承管理員權限。如何使用用戶權限而不是活動權限啓動程序

由於我的安裝程序的一部分,我推出一個C#應用程序來執行一些自定義的工作。這個小應用程序目前通過調用啓動盤應用:

Process.Start(@"path/to/my/tray/app.exe"); 

有沒有辦法來調用與當前用戶的權限,而不是給安裝的提升的權限托盤應用程序?

我聽說,推薦的方法做,這是有其周圍,然後啓動安裝程序啓動安裝程序,安裝程序的包裝EXE。如果可能,我想避免這種情況。

我使用WiX的構建MSI安裝程序,所以我也能接受,直接從維克斯/ MSI工作的解決方案。

回答

0

非常好的問題。我發現表面上工作的答案都有點混亂;最優雅的整體是EXE包裝。

看一看這篇文章:http://www.codeproject.com/KB/vista-security/RunNonElevated.aspx。它描述了一種方法,通過該方法,您可以獲得運行非提升的shell窗口的原生鉤子,並要求shell爲您啓動代碼。 C#中的原生鉤子需要非常高的CAS權限;要獲得這些權限,您的安裝程序必須是強命名和簽名的,並且代碼必須通過SecurityPermissionFlag.UnmanagedCode請求或斷言SecurityPermission。

.NET Framework的ProcessStartInfo類還包含一個UseShellExecute布爾屬性,該屬性在設置時告訴Process.Start()將此調用發送給shell,而不是直接從當前應用程序域啓動該過程。我不知道這是否會滿足你的需求,但它確實更容易嘗試;您只需使用Process.Start()的ProcessStartInfo重載與設置了標誌的已聲明ProcessStartInfo。

請記住,你不能告訴shell啓動的EXE爲除當前登錄的用戶(用戶名和密碼不得對的ProcessStartInfo設置)以外的用戶。您還必須使用WorkingDirectory屬性指定EXE的路徑。

+0

UseShellExecute顯然是默認設置爲true,所以它看起來像這樣將不利於雖然我還沒有嘗試過呢。謝謝你的回答,但我懷疑包裝EXE將是唯一的「整潔」的解決方案。 – mchr 2010-09-23 10:21:05

+0

我現在已經測試過,它不起作用。我也嘗試了一個C++ DLL調用http://msdn.microsoft.com/en-us/library/aa446583%28v=vs.85%29.aspx並啓動使用新的安全令牌。但是,這不會改變擁有已啓動進程的用戶 - 只有已啓動進程擁有的權限。 – mchr 2011-01-04 12:04:08

3

有兩種方法。最簡單的方法是使用一個shell exe文件,首先啓動管理任務提升(很多方法可以做到這一點;我更喜歡一個清單),然後另一個任務不升級。如果你因爲任何原因拒絕這麼做,那麼看看博客文章和我從我的博客文章鏈接到的CodePlex項目:http://www.gregcons.com/KateBlog/NonElevatedFromElevatedManagedThisTime.aspx

1

或者,你可以使用Windows API CreateProcessAsUser,這似乎是做這項工作。

+0

這對我來說是一種作爲從服務中以登錄用戶身份運行計劃任務的方式 – 2013-08-04 16:45:55