zoukankan      html  css  js  c++  java
  • 以管理员身份启动ClickOnce部署的应用程序

    ClickOnce方式部署应用简单方便,估计很多人都用过,但这种方式存在一定的“缺陷”,即以管理员方式启动应用的问题,虽然出于安全考虑可以理解,但给需要管理员权限才能正常运行的程序带来了一定的麻烦,这导致部分人员放弃了ClickOnce发布。

    经过查找相关资料,发现还是有办法解决这个问题的,具体操作如下:

    1、修改 manifest 文件

    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    经测试,如果应用程序没有 manifest 文件的,可以不用添加 app.manifest 文件,ClickOnce发布后会生成如下格式的 manifest  文件:主程序文件名命名.manifest (例如:Mytest.exe.manifest)

    自动生成的 manifest 文件中 requestedExecutionLevel 配置与上述一致。

    但以上不排除是个例,如果不配置此项出现异常时可考虑增加此设置。

    2、修改程序主函数(即“应用程序的主入口点”,例如: Program.cs 中的 Main 函数)

    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-eq

  • 相关阅读:
    获取linux内核的配置项(包含模块module)_转
    PPP或PPPOE身份验证PAP和CHAP
    iptables用法
    谁能当IBM公司的CEO?
    雷军失势小米痛哭_小米总喜欢花小钱办大事,然后就总是办不好事
    高并发TCP连接数目问题
    Linux定时任务Crontab命令详解_转
    树莓派3B+首次登陆通过网络
    tar包解压后用户名改变
    一些软件设计的原则_转
  • 原文地址:https://www.cnblogs.com/mic86/p/5438109.html
Copyright © 2011-2022 走看看