我有一个文件MyUtilities.exe
。
当我跑步时:
Process.Start("MyUtilities.exe","SomeParameter");
如果在没有管理员权限的情况下运行,则该进程的退出代码为0(OK)。如果我以管理员身份运行该代码,退出代码为1!
由于我没有创建MyUtilities.exe
,我无法修改它。
最后我需要以管理员身份运行Process.Start("MyUtilities.exe","SomeParameter");
并让它返回退出代码= 0.我设法做到这一点的方法是将其兼容性更改为:< / p>
(右键单击文件 - &gt;属性 - &gt;兼容性 - &gt;以管理员身份运行此程序)
现在更改后,我可以作为管理员运行Process.Start("MyUtilities.exe","SomeParameter");
并让它返回退出代码0。
所以我的问题是如何更改该文件与代码的兼容性,这样我就不必告诉用户右键单击该文件然后更改设置。
答案 0 :(得分:7)
这看起来很简单。只需在注册表中添加一个值即可。
重点:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
- 或 - HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
姓名:f:\ull\path\to\executable.exe
价值:RUNASADMIN
以下是您在代码中执行此操作的方法。如果您写入HKCU,则呼叫过程不需要以管理员身份运行。
static void SetRunAsAdmin(string exeFilePath)
{
var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true);
if (key == null)
throw new InvalidOperationException(@"Cannot open registry key HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers.");
using (key)
key.SetValue(exeFilePath, "RUNASADMIN");
}
答案 1 :(得分:1)
如果以管理员权限执行了调用过程,并开始生成“ MyUtilites.exe”,则它还将以管理员身份启动。只需转到项目的属性并查找以XML格式编写的清单文件即可。您将在该文件中看到“ asInvoker”,将其更改为“ requireAdministrator”。