有一天,我遇到了一個應用程序,當您運行它時,它會出現UAC屏幕並請求以管理員權限運行。點擊UAC屏幕上的「是」按照正常方式運行應用程序。有趣的是,如果點擊「否」,應用程序將不會退出,而是仍然運行,但在有限的用戶帳戶中運行(當然功能較少)。將應用程序配置爲在提升和非提升權限中運行
我的問題是,我如何配置我的C#應用程序來做到這一點?我知道我的應用程序可以有一個應用程序清單以提升的權限運行,但是如何複製我剛纔解釋過的那種行爲?
有一天,我遇到了一個應用程序,當您運行它時,它會出現UAC屏幕並請求以管理員權限運行。點擊UAC屏幕上的「是」按照正常方式運行應用程序。有趣的是,如果點擊「否」,應用程序將不會退出,而是仍然運行,但在有限的用戶帳戶中運行(當然功能較少)。將應用程序配置爲在提升和非提升權限中運行
我的問題是,我如何配置我的C#應用程序來做到這一點?我知道我的應用程序可以有一個應用程序清單以提升的權限運行,但是如何複製我剛纔解釋過的那種行爲?
要做到這一點與不同提升的應用程序,你可以使用「啓動器」(或啓動器是「正常」的應用程序)。
如果你想三個應用程序,你可能有一個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());
}
}
}
除了使用啓動器應用程序,沒有別的辦法。 –
我在想,我可以添加到'app.manifest'文件來做到這一點。使用啓動器雖然可能是最好的方法。謝謝彼得 – Icemanind
@icemanind清單的問題(即需要管理員權限)是,如果用戶選擇「否」,應用程序永遠不會運行。所以,你沒有機會運行代碼un-elevated ... –
你可以把所有的代碼在一個應用程序。應用程序清單不要求應用程序運行提升,它使用asInvoker
級別。
當應用程序啓動時,它會嘗試重新啓動自身。我的意思是它開始另一個過程與runas
動詞。如果成功,那麼第一個實例就存在。
如果提升不成功,那麼它將繼續以有限的功能運行。
不過想想用戶體驗:
在世界上不是每個人都可以作爲管理員。對於他們來說,仰角看起來不像點擊Continue
按鈕,UAC會要求他們提供管理員的用戶名和密碼。
從這個角度來看,微軟推薦的方法很好用:以普通用戶身份運行,直到你真的需要才能提升。所有標高點應在用戶界面中清楚標記。您仍然可以使用相同的exe文件來運行非提升和提升的實例,但您必須實現通信機制,以便非提升實例可以提供執行用戶請求的操作的所有數據。一旦你開始提升實例,你可以保持它運行並退出非提升實例,這樣其他操作可以在沒有提升的情況下執行。
因此這意味着更努力,但很多更好的用戶體驗。
推薦的方法是讓一個*不同的應用程序在提升模式下運行。重點是未升高的代碼應該與高位代碼分開。這不可能嗎? –
例如運行「提升」二進制文件;如果失敗,運行未升級的二進制文件... –
@PeterRitchie - 我明白你的意思了。但是這個邏輯到底在哪裏? 「如果提升運行此程序,否則運行此程序?」的邏輯。 – Icemanind