【问题标题】:Change executable compatibility with code更改与代码的可执行兼容性
【发布时间】:2014-03-21 20:14:36
【问题描述】:

我有一个文件MyUtilities.exe

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

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

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

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

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

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

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

【问题讨论】:

  • 这里有什么帮助吗? stackoverflow.com/questions/2532769/…
  • 是否必须直接调用MyUtilities.exe?是否可以选择调用 MyUtilities.exe 的 MyUtilitiesStarter.exe?
  • 我不明白。你想启动其他进程提升还是不提升。
  • 我不介意它是否被称为提升。我所关心的是退出代码为 0。如果我以非管理员身份运行我的 c# 代码,那么如果该 exe 也以非管理员身份运行,则退出代码为 0。如果我以管理员身份运行我的 c# 代码,那么 myUtilities.exe 也必须以管理员身份运行才能获得退出代码 = 0。换句话说,c# 和 myUtilites 必须以相同的权限运行才能获得退出代码 = 0。因为我的 c# 代码将以管理员身份运行,所以我想答案是肯定的,我也需要 myUtilities.exe 以管理员权限运行。
  • 您的分析有缺陷。当提升的进程启动另一个进程时,该子进程运行提升。您确实需要诊断问题。

标签: c# process compatibility privileges


【解决方案1】:

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

密钥: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");
}

【讨论】:

  • 如果 OP 不能以编程方式写入注册表,那么他就大错特错了。 :)
  • 这不是重点。该进程可以在不允许它写入注册表但仍允许运行外部进程的安全上下文中执行(弹出“你想以管理员身份运行”对话框)。
  • 这似乎是假的。只需将 UseShellExecute 设置为 true 并使用 runas 动词。也就是说,我根本不清楚这甚至是提问者想要做的事情。
  • OP 以一个简单的问题结束了他的帖子:“如何更改该文件与代码的兼容性?”你就是这样做的。
  • 这可能是被问到的,但显然不是答案。并且运行起来更干净。而且您可能需要避免注册表重定向。
【解决方案2】:

如果调用进程以管理员权限执行,并开始生成“MyUtilites.exe”,它也会以管理员身份启动。只需转到项目的属性并查找以 XML 格式编写的清单文件。您将在该文件中看到“asInvoker”,将其更改为“requireAdministrator”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多