使用 UAC 提升流程严谨性,无需 ShellExecute

本文关键字:严谨性 无需 ShellExecute UAC 使用 | 更新日期: 2023-09-27 18:35:39

我们遇到了代码问题,这些代码已经可以提升安装新打印机的帮助程序进程的权限。

我在这里找到了这个答案,它几乎与我们的代码相匹配:Windows 7 和 Vista UAC - 以编程方式在 C# 中请求提升

唯一的区别是我们将 ShellExecute 设置为 false。这导致了 Win32异常,即进程需要提升的权限。使用ShellExecute解决了这个问题。

我的问题是:为什么?很可能有一个有意义的答案,并且真的会理解会发生什么,这样我下次需要类似的东西时就会知道。

提前非常感谢所有提示!

使用 UAC 提升流程严谨性,无需 ShellExecute

以编程方式提升新进程的方法是要求 shell 使用动词 runas 执行可执行文件。这是唯一受支持的方法。为了将runas谓词传递给外壳,需要调用合适的 Win32 API 函数。可能的候选人包括ShellExecuteShellExecuteEx

UseShellExecute 属性确定在调用 Process.Start 时使用哪个 API 调用。如果UseShellExecute true,则调用ShellExecuteEx。否则调用CreateProcess

因此,当您将UseShellExecute设置为 false 时,您切换到使用 CreateProcessCreateProcess没有任何机制来提升新进程。因此,当UseShellExecute false时,您提供的runas动词将被简单地忽略,因为CreateProcess不接收shell动词。

这种行为是因为Process.Start内部使用两个API之一:CreateProcess或ShellExecuteEx。 只有后者支持 UAC 提升,这就是为什么您必须设置UseShellExecute = true .

有趣的是,还有另一种方法可以在不直接启动新进程的情况下实现 UAC 提升。 可以编写进程外 COM 组件来执行需要提升运行的实际工作。 然后,当您实例化组件时,它将在提升的进程中运行(在显示 UAC 提示之后)。 当然,在不使用 C++/CLI 的情况下在 .NET 中编写进程外 COM 组件并不容易。 但是请参阅此帖子以获取更多信息。

Microsoft第 9 频道的视频,解释了 UAC 的胆量。

在体系结构上,只有 ShellExecute 知道如何启动Consent.exe(UAC 对话框)。所以这就是为什么你必须使用它。