【问题标题】:Executing a process from .NET application without UAC prompt在没有 UAC 提示的情况下从 .NET 应用程序执行进程
【发布时间】:2011-09-04 02:53:16
【问题描述】:

我有一个场景,我需要从我的 .NET 应用程序中启动一个 EXE,但我无法绕过弹出的 UAC 提示。甚至在另一个 EXE 启动之前就触发了提示 - 可能是在调用 Process.Start 时。

我使用此代码启动应用程序:

            var info = new ProcessStartInfo(path, "params");
            info.Verb = "runas";
            try
            {
                Process.Start(info);
            }
            catch (System.ComponentModel.Win32Exception)
            {
                // Person denied UAC escallation
                return false;
            }

两个 EXE(我的应用程序和另一个 EXE)都在它们的清单中定义了这个:

    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

如何在不触发 UAC 提示的情况下执行另一个 EXE,并使其具有与调用应用程序相同的访问令牌(因此它可以更改应用程序文件夹等中的文件)?

【问题讨论】:

  • 我最初没有动词,并在查找修复后将其卡在那里。没有帮助,也没有让事情变得更糟。
  • 第二个 exe 的文件名是什么?有一些规则会为“setup”、“install”等文件名触发 UAC。
  • 两者都不是。我刚刚将其命名为“mytest.exe”并再次获得了 UAC。
  • 确保你取出runas,否则会触发UAC
  • @shsmith 很好。您可能想将此作为答案发布,以便我接受。谢谢!

标签: c# .net uac processstartinfo


【解决方案1】:

为了防止在启动第二个 EXE 时出现 UAC 提示:

1) 不要使用Verb = "runas"——那样每次都会给你UAC

2) 不要为您的 EXE 使用类似设置的文件名。这是来自MSDN的规则:

在创建 32 位进程之前, 检查以下属性 来确定它是否是一个 安装程序:

文件名包括关键字,如 “安装”、“设置”、“更新”等

以下版本控制中的关键字 资源字段:供应商、公司名称、 产品名称、文件

描述,原始文件名, 内部名称和导出名称。

并排清单中的关键字 嵌入在可执行文件中。

特定 StringTable 中的关键字 可执行文件中链接的条目。

链接的 RC 数据中的关键属性 在可执行文件中。

内的目标字节序列 可执行文件。

【讨论】:

  • 奇怪,我以为清单文件优先于设置启发式。
  • 显然不是 - 这是我的问题
猜你喜欢
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2021-05-21
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 2020-09-20
相关资源
最近更新 更多