使用 UAC 提升流程严谨性,无需 ShellExecute
本文关键字:严谨性 无需 ShellExecute UAC 使用 | 更新日期: 2023-09-27 18:35:39
我们遇到了代码问题,这些代码已经可以提升安装新打印机的帮助程序进程的权限。
我在这里找到了这个答案,它几乎与我们的代码相匹配:Windows 7 和 Vista UAC - 以编程方式在 C# 中请求提升
唯一的区别是我们将 ShellExecute 设置为 false。这导致了 Win32异常,即进程需要提升的权限。使用ShellExecute解决了这个问题。
我的问题是:为什么?很可能有一个有意义的答案,并且真的会理解会发生什么,这样我下次需要类似的东西时就会知道。
提前非常感谢所有提示!
以编程方式提升新进程的方法是要求 shell 使用动词 runas
执行可执行文件。这是唯一受支持的方法。为了将runas
谓词传递给外壳,需要调用合适的 Win32 API 函数。可能的候选人包括ShellExecute
和ShellExecuteEx
。
UseShellExecute
属性确定在调用 Process.Start
时使用哪个 API 调用。如果UseShellExecute
true
,则调用ShellExecuteEx
。否则调用CreateProcess
。
因此,当您将UseShellExecute
设置为 false
时,您切换到使用 CreateProcess
。CreateProcess
没有任何机制来提升新进程。因此,当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 对话框)。所以这就是为什么你必须使用它。