我正在研究“行政管理高程”,并且提出了一个看起来非常理智的解决方案,但是对于实现这一目标的专业方法,我仍然不了解。更好的方法还是这样做?

using System;
using System.Diagnostics;
using System.Security.Principal;
using System.Windows.Forms;

namespace MyVendor.Installation
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            if (!IsRunAsAdmin())           
            {
                Elevate();
                Application.Exit();
            }
            else
            {
                try
                {
                    Installer InstallerForm = new Installer();
                    Application.Run(InstallerForm);
                }
                catch (Exception e)
                {
                    //Display Exception message!

                    Logging.Log.Error("Unrecoverable exception:", e);
                    Application.Exit();
                }
            }
        }

        internal static bool IsRunAsAdmin()
        {
            var Principle = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            return Principle.IsInRole(WindowsBuiltInRole.Administrator);
        }

        private static bool Elevate()
        {
            var SelfProc = new ProcessStartInfo
                {
                    UseShellExecute = true,
                    WorkingDirectory = Environment.CurrentDirectory,
                    FileName = Application.ExecutablePath,
                    Verb = "runas"
                };
            try
            {
                Process.Start(SelfProc);
                return true;
            }
            catch
            {
                Logging.Log.Error("Unable to elevate!");
                return false;
            }
        }
    }
}


#1 楼

您可以创建清单文件并将应用程序设置为需要管理权限。当您的应用程序运行时,不需要任何代码,这将触发UAC用户提示,屏幕变暗。 >可以使用任何文本编辑器来创建此文件。应用程序清单文件应与扩展名为.manifest的目标可执行文件同名。






 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="<your exec name minus extension>"
     type="win32"/> 
  <description>Description of your application</description> 
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>
 



评论


\ $ \ begingroup \ $
是否可以在运行时提升应用程序?
\ $ \ endgroup \ $
– RobertPitt
2011年1月25日19:25

\ $ \ begingroup \ $
@RobertPitt这样,它将在启动时提升。除非授予管理员权限,否则它将不会启动。
\ $ \ endgroup \ $
–亚当·李尔♦
2011-1-25在19:33

#2 楼

为了使您的代码更清晰或与标准更好地融合,我将在代码中进行一些更改。并且变量RunningAsAdmin应该为小写字母,以匹配camelCasing变量的标准命名方案。而不是否定布尔值的方法,我会放任不管,而是以一种或另一种方式进行检查,这样否定看起来就不正确了返回一个布尔值?从我所看到的来看,使用true / false值实际上并没有执行任何操作。 br />
    internal static bool IsRunAsAdmin()
    {
        var Principle = new WindowsPrincipal(WindowsIdentity.GetCurrent());
        return Principle.IsInRole(WindowsBuiltInRole.Administrator);
    }


#3 楼

其他选项:

首先:有一种机制可通过COM提升应用程序的“部分” Monikers:通过COM,使用正确格式的名称来提升应用程序的一部分,使其脱离进程是资源管理器如何提升自身的一部分)。请参见MSDN http://msdn.microsoft.com/zh-cn/library/ms679687(v=vs.85).aspx

第二:如安娜所说:使用清单。

第三条:与Q中一样通过runas运行。