zoukankan      html  css  js  c++  java
  • C#程序以管理员权限运行(ZT)

          本文转载:http://www.cnblogs.com/Interkey/p/RunAsAdmin.html

           在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,如何实现这样的功能呢?

       

         下面演示 C# 程序如何实现提示用户以管理员权限运行。

         本例以WinForm程序演示,新建一项目生成后进行相应修改:

    方法一:通过 System.Diagnostics.Process.Start() 方式启动:

        

     1 static class Program
     2     {
     3         /// <summary>
     4         /// 应用程序的主入口点。
     5         /// </summary>
     6         [STAThread]
     7         static void Main(string[] Args)
     8         {
     9             Application.EnableVisualStyles();
    10             Application.SetCompatibleTextRenderingDefault(false);
    11             System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
    12             System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
    13             bool createNew;
    14             //通过Mutex对象判断程序是否已经启动
    15             using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out createNew))
    16             {
    17                 if (createNew)
    18                 {
    19                     if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
    20                     {
    21                         //如果是管理员,则直接运行   
    22                         //AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    23                         //Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    24                         Application.Run(new MainForm());
    25                     }
    26                     else
    27                     {
    28                         //创建启动对象   
    29                         System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    30                         
    31                         //设置运行文件   
    32                         startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
    33                         //设置启动参数   
    34                         startInfo.Arguments = String.Join(" ", Args);
    35                         //设置启动动作,确保以管理员身份运行   
    36                         startInfo.Verb = "runas";
    37                         //如果不是管理员,则启动UAC   
    38                         System.Diagnostics.Process.Start(startInfo);
    39                         //退出   
    40                         System.Windows.Forms.Application.Exit();
    41                     }
    42                 }
    43                 else
    44                 {
    45                     MessageBox.Show("程序已经在运行中...", "提示", MessageBoxButtons.OK,
    46                          MessageBoxIcon.Asterisk);
    47                     System.Threading.Thread.Sleep(1000);
    48                     System.Environment.Exit(1);
    49                 }
    50             }
    51         }
    52     }

          效果:由于是通过System.Diagnostics.Process.Start() 方式外部调用启动,所以直接通过VS运行时,是不会提示VS也需要管理员权限,只有程序本身需要管理员权限,与生成应用程序的程序不同。这点是和方法二实现的主要不同之处。

    方法二:通过添加应用程序清单文件:

    在 项目 上 添加新项 选择“应用程序清单文件” 然后单击 添加 按钮

    添加后,默认打开app.manifest文件,将:

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

    修改为:

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

    然后打开 项目属性 ,将 应用程序 标签页中的 资源 中的 清单 修改为新建的 app.manifest。

    重新生成项目,再次打开程序时就会提示 需要以管理员权限运行。

    需要注意的是:如果在VS中 启动调试 的话,就会提示 此任务要求应用程序具有提升的权限。

    方法三:直接修改程序文件的属性

    右击程序文件,在弹出的属性对话框中的 兼容性 标签页中

    勾选“以管理员身份运行此程序”即可。

  • 相关阅读:
    tomcat窗口修改显示名字
    Windows Server 2012 安装oracle11g
    oracle查看和修改session和最大连接数
    ORA-12518 TNS:监听程序无法分发客户机连接的解决办法
    Oracle数据导入导出imp/exp :未知的命令开头。。。忽略了剩余的行
    用Dev C++编写第一个C语言程序
    PAT 甲级 1045 Favorite Color Stripe (30 分)(思维dp,最长有序子序列)
    PAT 甲级 1043 Is It a Binary Search Tree (25 分)(链表建树前序后序遍历)*不会用链表建树 *看不懂题...
    PAT 甲级 1044 Shopping in Mars (25 分)(滑动窗口,尺取法,也可二分)
    数据库设计的基本步骤
  • 原文地址:https://www.cnblogs.com/Charles2008/p/6893078.html
Copyright © 2011-2022 走看看