在没有ShellExecute的情况下使用UAC提升流程严格性

时间:2013-10-15 13:39:32

标签: c# uac

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

我在这里找到了这个答案,几乎与我们的代码匹配: Windows 7 and Vista UAC - Programmatically requesting elevation in C#

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

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

非常感谢所有提示!

3 个答案:

答案 0 :(得分:3)

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

UseShellExecute属性确定您致电Process.Start时使用的API调用。如果UseShellExecutetrue,则会调用ShellExecuteEx。否则调用CreateProcess

因此,当您将UseShellExecute设置为false时,您切换为使用CreateProcess。并且CreateProcess没有任何提升新流程的机制。因此,当UseShellExecutefalse时,您提供的runas动词将被忽略,因为CreateProcess不接收shell动词。

答案 1 :(得分:1)

行为是因为Process.Start在内部使用了两个API之一:CreateProcessShellExecuteEx。只有后者支持UAC提升,我们为什么必须设置UseShellExecute = true

除此之外,还有另一种方法可以实现 UAC提升,而无需直接启动新流程。您可以编写进程外COM组件来执行需要运行的实际工作。然后,在实例化组件时,它将在提升的进程中运行(在显示UAC提示后)。当然,如果不使用C ++ / CLI在.NET中编写进程外COM组件并不容易。但请参阅this post了解详情。

答案 2 :(得分:0)

Microsoft Channel 9 video that explains the guts of UAC.

在架构上,只有ShellExecute知道如何启动Consent.exe(UAC对话框)。这就是你必须使用它的原因。