Visual Studio 2012 中以管理员身份调试应用程序

做~自己de王妃 提交于 2020-04-21 07:16:42

今天写了一个程序,功能是获取任务管理器中的“描述”一列中的内容:

C#代码如下:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GetProcDesc
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] procs = Process.GetProcessesByName("pcas");
            foreach (Process proc in procs)
            {
                try
                {
                    string path = proc.MainModule.FileName.ToString();
                    FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(path);

                    Console.WriteLine("进程:" + proc.ProcessName);
                    Console.WriteLine("路径:" + path);
                    Console.WriteLine("描述:" + fileVersionInfo.FileDescription);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }

            Console.Read();
        }
    }
}

但执行这段代码时,会报错 System.ComponentModel.Win32Exception:拒绝访问

后来我查了一下,发现这个错误与Windows的权限管理有关系,我试着用管理员身份运行编译好的exe程序,此时程序便可正常执行了:

于是我就想,既然用管理员身份就可以正常执行,那能不能直接在 VisualStudio 中就以管理员身份开启程序的调试呢?经过一番研究,答案是肯定的。

我的操作系统是Win7,使用的VS版本是VS2012。

打开程序集的属性窗口,找到“安全性”设置,其中有一个“启用 ClickOnce 安全性设置”,勾选后再反勾选该复选框。

此时在解决方案资源管理器中,就可以找到 app.manifest 文件,勾选“启用 ClickOnce 安全性设置”是为了让VS生成这个文件,取消勾选是为了支持后面对 requestedExecutionLevel 的设置。

打开 app.manifest,将 requestedExecutionLevel 设置为

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

如下图所示:


三个level的功能如下:

asInvoker:应用程序就是以当前的权限运行。

highestAvailable:应用程序以当前用户可以获得的最高权限运行。

requireAdministrator:应用程序仅以系统管理员权限运行。

我们将其改为 requireAdministrator

此时再次调试程序时,VS会提示“此任务要求应用程序具有提升的权限”,点击“使用其他凭据重新启动”即可。如果还是弹出之前“拒绝访问”的异常,可尝试重启一下VS。

此时VS会重启,可以看到,重启后的VS左上角的窗体标题上多了一个“(管理员)”

此时再调试程序,就可以直接以管理员身份进行调试了


END

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!