ClickOnce方式部署应用简单方便,估计不少人都用过,但这种方式存在必定的“缺陷”,即以管理员方式启动应用的问题,虽然出于安全考虑能够理解,但给须要管理员权限才能正常运行的程序带来了必定的麻烦,这致使部分人员放弃了ClickOnce发布。安全
通过查找相关资料,发现仍是有办法解决这个问题的,具体操做以下:app
一、修改 manifest 文件函数
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
经测试,若是应用程序没有 manifest 文件的,能够不用添加 app.manifest 文件,ClickOnce发布后会生成以下格式的 manifest 文件:主程序文件名命名.manifest (例如:Mytest.exe.manifest)测试
自动生成的 manifest 文件中 requestedExecutionLevel 配置与上述一致。ui
但以上不排除是个例,若是不配置此项出现异常时可考虑增长此设置。spa
二、修改程序主函数(即“应用程序的主入口点”,例如: Program.cs 中的 Main 函数)code
using System; using System.Diagnostics; using System.Reflection; using System.Security.Principal; using System.Windows.Forms; namespace MyTest { static class Program { [STAThread] static void Main() { Action run = () => { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormMain()); }; WindowsIdentity wi = WindowsIdentity.GetCurrent(); bool runAsAdmin = wi != null && new WindowsPrincipal(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(); } } } }
原文地址:http://www.codeproject.com/Tips/627850/ClickOnce-deployment-vs-requestedExecutionLevel-eqorm