我们遇到了一些代码问题,这些代码已经起到提升安装新打印机的帮助程序进程权限的作用。
我在这里找到了这个答案,几乎与我们的代码匹配: Windows 7 and Vista UAC - Programmatically requesting elevation in C#
唯一的区别是我们将ShellExecute设置为false。这导致Win32Exception,该进程需要提升权限。使用ShellExecute解决了这个问题。
我的问题是:为什么?很可能有一个答案是有道理的,并且真的要了解会发生什么,所以我知道下次需要类似的东西。
非常感谢所有提示!
答案 0 :(得分:3)
以编程方式提升新进程的方法是让shell使用动词runas
执行可执行文件。这是唯一受支持的方式。为了将runas
动词传递给shell,您需要调用合适的Win32 API函数。可能的候选人包括ShellExecute
和ShellExecuteEx
。
UseShellExecute
属性确定您致电Process.Start
时使用的API调用。如果UseShellExecute
为true
,则会调用ShellExecuteEx
。否则调用CreateProcess
。
因此,当您将UseShellExecute
设置为false
时,您切换为使用CreateProcess
。并且CreateProcess
没有任何提升新流程的机制。因此,当UseShellExecute
为false
时,您提供的runas
动词将被忽略,因为CreateProcess
不接收shell动词。
答案 1 :(得分:1)
行为是因为Process.Start
在内部使用了两个API之一:CreateProcess或ShellExecuteEx。只有后者支持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对话框)。这就是你必须使用它的原因。