改变与代码的可执行兼容性

时间:2014-02-20 17:35:27

标签: c# process compatibility privileges

我有一个文件MyUtilities.exe

当我跑步时: Process.Start("MyUtilities.exe","SomeParameter");

如果在没有管理员权限的情况下运行,则该进程的退出代码为0(OK)。如果我以管理员身份运行该代码,退出代码为1!

由于我没有创建MyUtilities.exe,我无法修改它。

最后我需要以管理员身份运行Process.Start("MyUtilities.exe","SomeParameter"); 并让它返回退出代码= 0.我设法做到这一点的方法是将其兼容性更改为:< / p>

enter image description here

(右键单击文件 - &gt;属性 - &gt;兼容性 - &gt;以管理员身份运行此程序)

现在更改后,我可以作为管理员运行Process.Start("MyUtilities.exe","SomeParameter");并让它返回退出代码0。

所以我的问题是如何更改该文件与代码的兼容性,这样我就不必告诉用户右键单击该文件然后更改设置。

2 个答案:

答案 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”。