更改代码的可执行兼容性

Ton*_*Nam 0 c# privileges compatibility process

我有一个文件MyUtilities.exe.

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

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

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

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

在此输入图像描述

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

在更改之后,我现在能够以Process.Start("MyUtilities.exe","SomeParameter");管理员身份运行并返回退出代码0.

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

Mic*_*ter 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");
}
Run Code Online (Sandbox Code Playgroud)