2010-04-21 125 views
6

我有修改Windows註冊表的簡單的WinForms應用程序。問題是在Vista/Windows 7中我需要強制用戶切換到管理員。如何強制用戶在WinForms的用戶管理員帳戶

我不想強制用戶以管理員身份運行應用程序的開始表單。當有必要寫入註冊表時,我希望他這樣做。

當用戶需要'切換'到管理員,所以沒有必要以管理員身份從頭開始運行時,最好的情況將是非常接近出現在設置的批次中的相同消息。

我如何在.Net中實現這一點?

回答

4
清單

如果應用程序有時並不執行註冊表事情,有時候需要分區,分區的三個關鍵是(1)在第二個exe文件上有一個清單,正如Ho所說的那樣(2)在按鈕/菜單項上放置一個屏蔽層,以便用戶期望該高程,以及(3)用ShellExecute啓動它(之前調用Start,將UseShellExecuteFlag設置爲true),以便使用清單。

然而,在分解你的應用程序的麻煩之前,我會問兩個問題。首先,它是否曾用於非管理目的,或者每個用戶總是「單擊該按鈕」並需要提升?如果是這樣,那麼只需在應用上放置一個管理員清單,而不要對其進行分區。其次,你確定需要寫入註冊表的那一部分嗎?你可以把鑰匙移到HKCU下的東西嗎?如果可以的話,那麼你不再需要提升,每個人都更快樂。我總是喜歡首先考慮這些可能性,因爲它們意味着代碼少,測試少於分配。

+0

我需要這些權限與擴展名的文件關聯。在HKCU它將檢查遠端的關聯:(看起來這不是一個好的解決方案。 – 2010-04-22 22:21:51

1

據我所知,沒有API來提升進程。它會在進程嘗試在提升模式下啓動另一個進程時自動發生。

這也是它如何與Windows Installer配合使用。我不確定它是從字面上開始另一個提升的過程,還是隻創建一個提升的COM對象,但它實際上是同樣的事情。

我個人不會訴諸這種駭人的解決方法,以提升您的過程中執行;如果您的進程可能需要提升,請使用清單進行顯式清理,並在啓動時彈出同意消息。但是,如果你絕對必須這樣做,那麼就是這樣 - 你需要從你的應用程序中啓動一個提升過程。

+1

我實際上認爲最好只在需要時詢問高程。在同一Windows Installer的情況下,我喜歡我可以通過這些選項,並且可以在任何時間點取消,而無需讓應用程序以提升模式運行。它只會在需要時詢問高程,而不是「僅用於顯示」:) – 2010-04-21 07:38:35

+0

@Artiom:但正如我所解釋的那樣,安裝程序只是一個存根。實際的「安裝」是在進程外完成的。如果您的應用程序可以按照相同的方式進行分區,並且具有特定的高級「步驟」,那麼該方法僅適用於您的應用程序,否則您的應用程序將每隔2分鐘啓動一次單獨的進程,或者每當它決定需要提升時啓動它一件好事。 – Aaronaught 2010-04-21 13:20:13

+0

確實,你是絕對正確 – 2010-04-21 13:47:54

2

正如Aaronaught所說,我認爲一個過程不可能要求提升自己。解決此問題的方法是,你拆你的過程分爲兩個應用,一個是正常的,做了大部分工作,而另一個不僅寫入註冊表而這其中有一個包含類似

<requestedExecutionLevel level="requireAdministrator"/> 
相關問題