2012-09-20 68 views
2

有一天,我遇到了一個應用程序,當您運行它時,它會出現UAC屏幕並請求以管理員權限運行。點擊UAC屏幕上的「是」按照正常方式運行應用程序。有趣的是,如果點擊「否」,應用程序將不會退出,而是仍然運行,但在有限的用戶帳戶中運行(當然功能較少)。將應用程序配置爲在提升和非提升權限中運行

我的問題是,我如何配置我的C#應用​​程序來做到這一點?我知道我的應用程序可以有一個應用程序清單以提升的權限運行,但是如何複製我剛纔解釋過的那種行爲?

+0

推薦的方法是讓一個*不同的應用程序在提升模式下運行。重點是未升高的代碼應該與高位代碼分開。這不可能嗎? –

+0

例如運行「提升」二進制文件;如果失敗,運行未升級的二進制文件... –

+0

@PeterRitchie - 我明白你的意思了。但是這個邏輯到底在哪裏? 「如果提升運行此程序,否則運行此程序?」的邏輯。 – Icemanind

回答

1

要做到這一點與不同提升的應用程序,你可以使用「啓動器」(或啓動器是「正常」的應用程序)。

如果你想三個應用程序,你可能有一個WinForms發射類似:

[STAThread] 
static void Main() 
{ 
    const int ERROR_CANCELLED = 1223; 
    try 
    { 
     Process.Start("el.exe"); 
     // ran el in elevated node... 
    } 
    catch (Win32Exception ex) 
    { 
     if (ex.NativeErrorCode == ERROR_CANCELLED) 
     { 
      Process.Start("normal.exe"); 
     } 
    } 
} 

如果你在做兩個應用程序,你可以這樣做:

[STAThread] 
static void Main() 
{ 
    const int ERROR_CANCELLED = 1223; 
    try 
    { 
     Process.Start("el.exe"); 
     // ran el in elevated node... 
    } 
    catch (Win32Exception ex) 
    { 
     if (ex.NativeErrorCode == ERROR_CANCELLED) 
     { 
      // "continue" as un-elevated app. 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 
    } 
} 
+0

除了使用啓動器應用程序,沒有別的辦法。 –

+0

我在想,我可以添加到'app.manifest'文件來做到這一點。使用啓動器雖然可能是最好的方法。謝謝彼得 – Icemanind

+0

@icemanind清單的問題(即需要管理員權限)是,如果用戶選擇「否」,應用程序永遠不會運行。所以,你沒有機會運行代碼un-elevated ... –

0

你可以把所有的代碼在一個應用程序。應用程序清單不要求應用程序運行提升,它使用asInvoker級別。

當應用程序啓動時,它會嘗試重新啓動自身。我的意思是它開始另一個過程與runas動詞。如果成功,那麼第一個實例就存在。

如果提升不成功,那麼它將繼續以有限的功能運行。


不過想想用戶體驗:

在世界上不是每個人都可以作爲管理員。對於他們來說,仰角看起來不像點擊Continue按鈕,UAC會要求他們提供管理員的用戶名和密碼。

從這個角度來看,微軟推薦的方法很好用:以普通用戶身份運行,直到你真的需要才能提升。所有標高點應在用戶界面中清楚標記。您仍然可以使用相同的exe文件來運行非提升和提升的實例,但您必須實現通信機制,以便非提升實例可以提供執行用戶請求的操作的所有數據。一旦你開始提升實例,你可以保持它運行並退出非提升實例,這樣其他操作可以在沒有提升的情況下執行。

因此這意味着更努力,但很多更好的用戶體驗