2014-02-20 33 views
0

我有一个文件MyUtilities.exe更改与代码的可执行兼容性

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

该进程的退出代码为0(OK),如果它运行没有管理员权限。如果我以管理员退出码的形式运行该代码为1!

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

在我需要运行Process.Start("MyUtilities.exe","SomeParameter");作为管理员并使其返回退出代码末尾= 0。我设法做到这一点的方法是通过改变它的兼容性:

enter image description here

(右键点击文件 - >属性 - >兼容性 - >运行该程序作为管理员)改变,现在我能够运行Process.Start("MyUtilities.exe","SomeParameter");作为管理员拥有它之后

返回0。

退出代码所以我的问题是我如何可以改变代码该文件的兼容性,从而确保我没有告诉用户右键点击该文件,然后更改设置。

+0

这里的一切有帮助吗? http://stackoverflow.com/questions/2532769/how-to-start-a-process-as-administrator-mode-in-c-sharp – Crono

+1

是否必须直接调用MyUtilities.exe?是否可以调用调用MyUtilities.exe的MyUtilitiesStarter.exe? – Linky

+0

我不明白。你想开始另一个过程升高还是不升高? –

回答

6

这看起来很简单。只需向注册表添加一个值即可。

重点: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"); 
} 
+0

OP询问如何在代码*中执行*。 – Crono

+1

如果OP无法以编程方式写入注册表,他就会头痛。 :) –

+0

这不是重点。该进程可以在一个安全上下文中执行,该安全上下文不允许它写入注册表,但仍允许运行一个外部进程(弹出“你想以管理员身份运行”对话框)。 – Crono