今天写了一个程序,功能是获取任务管理器中的“描述”一列中的内容:c#
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:拒绝访问
app
后来我查了一下,发现这个错误与Windows的权限管理有关系,我试着用管理员身份运行编译好的exe程序,此时程序即可正常执行了:ui
因而我就想,既然用管理员身份就能够正常执行,那能不能直接在 VisualStudio 中就以管理员身份开启程序的调试呢?通过一番研究,答案是确定的。spa
个人操做系统是Win7,使用的VS版本是VS2012。操作系统
打开程序集的属性窗口,找到“安全性”设置,其中有一个“启用 ClickOnce 安全性设置”,勾选后再反勾选该复选框。
调试
此时在解决方案资源管理器中,就能够找到 app.manifest 文件,勾选“启用 ClickOnce 安全性设置”是为了让VS生成这个文件,取消勾选是为了支持后面对 requestedExecutionLevel 的设置。code
打开 app.manifest,将 requestedExecutionLevel 设置为
xml
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
以下图所示:
进程
三个level的功能以下:
asInvoker:应用程序就是以当前的权限运行。
highestAvailable:应用程序以当前用户能够得到的最高权限运行。
requireAdministrator:应用程序仅以系统管理员权限运行。
咱们将其改成 requireAdministrator
此时再次调试程序时,VS会提示“此任务要求应用程序具备提高的权限”,点击“使用其余凭据从新启动”便可。若是仍是弹出以前“拒绝访问”的异常,可尝试重启一下VS。
此时VS会重启,能够看到,重启后的VS左上角的窗体标题上多了一个“(管理员)”
此时再调试程序,就能够直接以管理员身份进行调试了
END