2011-01-09 64 views
7

背景授予在沒有UAC提示的情況下啓動時啓動的應用程序的管理員權限?

我寫了一個小的C#/。NET 4.0應用程序,從安裝在Program Files文件,並從不同的機器上同一遊戲的其他副本遊戲同步的各種設置(認爲Chrome的書籤同步,但是這個遊戲)。同步本身是一個相對簡單的事情,處理存儲在遊戲的Program Files文件夾中的文件。

在我的機器上,這工作正常,無需通過UAC提升我的應用程序。 Windows 7使遊戲使用程序文件虛擬化,我的應用程序正常工作。

但是,在很多測試儀的機器上,我得到報告說應用程序無法使用這些文件,並且在來的情況下甚至無法看到遊戲的文件夾!讓用戶右鍵單擊並以「以管理員身份運行」解決每種情況下的問題。

所以,我們只是設置應用程序的清單要求管理員權限,對吧?當用戶手動調用應用程序或同步過程時,這很好(雖然不理想),因爲它們將與應用程序交互並準備好接受UAC請求。

但是,我的應用程序的功能之一是「自動同步」選項,它允許用戶「設置並忘記」應用程序。使用此設置,應用程序會將自己放入HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run註冊表中,以便在啓動時運行,並在系統托盤中根據需要同步後臺中的設置。

顯然,我需要在這裏變得更聰明。一旦用戶登錄到他們的賬戶或之後的隨機間隔,提出UAC提示並不是前進的方向。

所以,我的問題!

在需要管理員權限的啓動時需要運行應用程序時,處理這種情況的最佳方法是什麼?有沒有辦法讓用戶授權安裝,導致系統在啓動/登錄時沒有提示而自動運行具有正確權限的應用程序?

更新要明確,這必須在代碼中可以實現。

+1

我認爲這會啓發你:http://stackoverflow.com/questions/2488632/win-c-run-app-as-administrator-without-uac-prompt/2488645#2488645乾杯:) – Machinarius 2011-01-09 16:01:48

回答

6

您應該考慮使Windows服務中存在Sync功能。 這是在Windows上運行「後臺」功能的首選方法。

服務可以在用戶帳戶下運行(假設他們有權修改文件),也可以使用另一個帳戶。最糟糕的情況是,你可以像SYSTEM一樣運行(儘管這不是最佳實踐)。

如果您已經擁有了後臺進程功能,那麼這應該是一個轉換爲服務的簡單過程。

這裏有一個示例項目,將設置你在正確的道路上:http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

+0

謝謝 - 安裝作爲一項服務似乎是要做的。謝謝! – iKenndac 2011-01-12 16:12:15

2

我會使用安全命名空間和檢查在線用戶角色。

using System.Threading; 
using System.Security.Principal; 

namespace StackOverflow_Demo 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 
     WindowsPrincipal currentPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal; 

     if (currentPrincipal.IsInRole("Administrators")) 
     { 
      // continue programm 
     } 
     else 
     { 
      // throw exception/show errorMessage - exit programm 
     } 
    } 
    } 
} 

當前用戶可能會啓動您的應用程序,並且如果他不是admininistrator角色的成員將會收到一條信息消息!

希望這可以幫助!

+0

謝謝,但這不是我問的問題的答案! – iKenndac 2011-01-09 23:08:31

1

既然你提到在啓動時運行,爲什麼不使用計劃任務而不是使用註冊表?你可以從代碼中設置它們 - 這裏有a project on CodePlex,它基本上是一個託管包裝器,可以讓你不必自己做PInvokes。你運行你的小「設置啓動任務」應用程序提升,它指定該應用程序應啓動提升,用戶甚至不會提示。我相信這是你最後一段中問題的答案。

相關問題