2

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

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

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

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

非常感谢所有提示!

4

3 回答 3

3

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

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

因此,当您设置UseShellExecute为时false,您切换到使用CreateProcess. 并且CreateProcess没有任何机制来提升新进程。所以 when UseShellExecuteis falserunas你提供的动词被简单地忽略了,因为CreateProcess没有接收到 shell 动词。

于 2013-10-15T13:42:36.400 回答
2

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

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

于 2013-10-15T13:45:41.170 回答
1

Microsoft Channel 9 视频,解释了 UAC 的内容。

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

于 2014-01-01T05:42:00.427 回答