marclee44 / me

1 stars 0 forks source link

C#程序自动申请管理员权限启动 #16

Open marclee44 opened 2 years ago

marclee44 commented 2 years ago

有时候,我们以C#开发的Windows应用程序,需要进行管理员权限的操作,类似:写系统日志、修改注册表等等。此时,我们通常有2个办法主动进行申请。

添加应用程序清单文件

这个文件通常有2种方法可以添加

  1. 在项目内添加新项,选择“应用程序清单文件” 添加新项
  2. 勾选再取消项目属性-安全性-启用ClickOnce安全设置 ClickOnce

这2个方法,都会在你的项目中,添加一个app.manifest文件。 app.manifest 找到代码段<requestedExecutionLevel level="asInvoker" uiAccess="false" />,将其中的asInvoker改为requireAdministrator,重新编译,即会在程序启动时,主动申请管理员权限。 这是我使用最多的方式。

以Process.Start() 方式启动自己的新实例

直接上代码

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            /**
             * 当前用户是管理员的时候,直接启动应用程序
             * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
             */
            //获得当前登录的Windows用户标示
            System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            //判断当前登录用户是否为管理员
            if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
            {
                //如果是管理员,则直接运行
                Application.Run(new Form1());
            }
            else
            {
                //创建启动对象
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.UseShellExecute = true;
                startInfo.WorkingDirectory = Environment.CurrentDirectory;
                startInfo.FileName = Application.ExecutablePath;
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
                try
                {
                    System.Diagnostics.Process.Start(startInfo);
                }
                catch
                {
                    return;
                }
                Application.Exit();
            }
        }

除此以外,其实也可以直接设置程序的文件属性,以管理员身份运行此程序。但这并不是程序本身的工作,故不在本文具体描述