ClickOnce方式部署應用簡單友善,估計很多人都用過,但這種方式存在一定的“缺陷”,即以管理者方式啟動應用的問題,雖然出于安全考慮可以了解,但給需要管理者權限才能正常運作的程式帶來了一定的麻煩,這導緻部分人員放棄了ClickOnce釋出。
經過查找相關資料,發現還是有辦法解決這個問題的,具體操作如下:
1、修改 manifest 檔案
經測試,如果應用程式沒有 manifest 檔案的,可以不用添加 app.manifest 檔案,ClickOnce釋出後會生成如下格式的 manifest 檔案:主程式檔案名命名.manifest (例如:Mytest.exe.manifest)
自動生成的 manifest 檔案中 requestedExecutionLevel 配置與上述一緻。
但以上不排除是個例,如果不配置此項出現異常時可考慮增加此設定。
2、修改程式主函數(即“應用程式的主入口點”,例如: Program.cs 中的 Main 函數)
usingSystem;usingSystem.Diagnostics;usingSystem.Reflection;usingSystem.Security.Principal;usingSystem.Windows.Forms;namespaceMyTest
{static classProgram
{
[STAThread]static voidMain()
{
Action run= () =>{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(newFormMain());
};
WindowsIdentity wi=WindowsIdentity.GetCurrent();bool runAsAdmin = wi != null && newWindowsPrincipal(wi).IsInRole(WindowsBuiltInRole.Administrator);if (!runAsAdmin)
{try{//不可能以管理者方式直接啟動一個 ClickOnce 部署的應用程式,是以嘗試以管理者方式啟動一個新的程序
Process.Start(new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase) { UseShellExecute = true, Verb = "runas"});
}catch(Exception ex)
{
MessageBox.Show(string.Format("以管理者方式啟動失敗,将嘗試以普通方式啟動!{0}{1}", Environment.NewLine, ex), "出錯啦!", MessageBoxButtons.OK, MessageBoxIcon.Error);
run();//以管理者方式啟動失敗,則嘗試普通方式啟動
}
Application.Exit();
}else{
run();
}
}
}
}