【问题标题】:What are the differences between "Run as administrator" and a manifest with requireAdministrator?“以管理员身份运行”和带有 requireAdministrator 的清单有什么区别?
【发布时间】:2011-03-14 13:55:08
【问题描述】:

我编写了一个带有包含 requireAdministrator 的清单的程序。在启用了 UAC 的 Windows 7 系统上,Windows 会弹出一个对话框,询问权限,这是应该的。效果很好。

如果用户通过右键单击我的程序并选择“以管理员身份运行”来启动我的程序,那么 Windows 7 也会弹出一个对话框询问权限。但是,我的程序在我的程序的一些更深奥的部分中的运行方式存在一些细微差别。

那么“以管理员身份运行”和使用 requireAdministrator 的清单有什么区别?任何描述差异的文档链接将不胜感激。

编辑:这是启用了 UAC。

编辑:下面承诺的是我所看到的差异的完整解释。

我正在使用EasyHook library 将 DLL 注入另一个进程。当我的应用程序以“以管理员身份运行”运行时,注入的进程崩溃并且 EasyHook 返回错误“注入的汇编代码中的未知错误”。我的 DLL 中的任何代码都没有机会执行;崩溃发生在此之前。 (此外,即使我将 DLL 剥离为空,也会发生崩溃)

如果我正常运行我的程序(即通过 requireAdministrator 提升),一切正常。

我的应用程序由几个不同的可执行文件组成。用户启动的进程与执行注入的进程不同。

【问题讨论】:

  • 如果您提及您观察到的差异可能会有所帮助。
  • 我完全不希望有任何差异。 (我也很确定在流程的运行期间应该没有。)也许您正在从您的流程开始一个新流程?那么,第一个进程获得其特权的方式就不再是这一点了。
  • @Daniel:恐怕我做不到。我只是猜测任何差异都可能与子流程有关。因为如果我们不理会这些事情,我根本无法想象有什么不同。在这两种情况下,应用程序都以提升的权限运行(同样类型);唯一不同的是应用程序如何获得此海拔。
  • 据我所知没有区别。我刚刚用一个简单的“Hello world”程序运行了一个测试,在这两种情况下它们都得到了完全相同的设置(相同的管理令牌、没有虚拟化等)。我真的不明白这两种方法有什么不同。你没有告诉我们什么?
  • 我也希望没有差异。清单,exe上的compat设置,右键单击以管理员身份运行,从您提升的命令提示符启动,有很多方法可以提升它,但我会说提升是提升的。期待了解您认为它们之间的不同之处。

标签: windows windows-7 permissions uac manifest


【解决方案1】:

根据给出的信息,两个进程之间的权限不会有任何差异。

如果您通过应用程序清单请求“requireAdministrator”的执行级别,您的应用程序将使用管理员的完全访问令牌启动,或者如果用户拒绝同意则根本不启动(请参阅Create and Embed an Application Manifest (UAC) em> 了解更多信息)。

当用户选择以管理员身份运行时也会发生同样的情况。

唯一的区别是进程的启动方式。当您从 shell 启动可执行文件时,例如通过在资源管理器中双击或从上下文菜单中选择以管理员身份运行,shell 将调用ShellExecute 来实际开始进程执行。整个提升过程都隐藏在这个函数里面。 Kenny Kerr 在 Windows Vista for Developers – Part 4 – User Account Control 中更详细地描述了这个过程:

ShellExecute 首先调用 CreateProcess 来尝试创建新进程。 CreateProcess 完成检查应用程序兼容性设置、应用程序清单、运行时加载程序等的所有工作。如果它确定应用程序需要提升但调用进程未提升,则 CreateProcess 失败并显示 ERROR_ELEVATION_REQUIRED。 ShellExecute 然后调用应用程序信息服务来处理提升提示和提升进程的创建,因为调用进程显然没有执行此类任务所需的权限。应用程序信息服务最终使用不受限制的管理员令牌调用 CreateProcessAsUser。

另一方面,如果您想创建一个提升的进程而不考虑可用的应用程序信息,那么您可以使用 ShellExecute 指定鲜为人知的“runas”动词。无论应用程序的清单和兼容性信息可能规定什么,这都会产生请求提升的效果。 runas 动词实际上并不是 Windows Vista 的新功能。它在 Windows XP 和 Windows 2003 上可用,通常用于直接从外壳创建受限令牌。然而,这种行为已经改变。这是一个简单的例子:

::ShellExecute(0, // owner window
           L"runas",
           L"C:\\Windows\\Notepad.exe",
           0, // params
           0, // directory
           SW_SHOWNORMAL);

所以基本上使用 以管理员身份运行 选项启动可执行文件意味着ShellExecute 绕过兼容性设置、应用程序清单等检查并直接请求提升。

Kenny Kerr 的文章还提供了示例代码,用于使用 OpenProcessToken 函数查询当前进程的令牌以获得其权限。可能您可以使用该示例来确定提升流程的方式没有差异。

我非常想知道您观察到哪些差异,因为我非常怀疑它们与海拔有关。

最后一件事:您能否仔细检查一下您确实请求了 requireAdministrator 级别,而不是错误地只请求了 highestAvailable 级别?

【讨论】:

  • 我仔细检查并设置为requireAdministrator。
  • CreateProcessAsUser 和 runas 动词之间的行为是否存在细微差别? (无论是与海拔有关还是与环境变量等无关的事物)
  • @Daniel Stutzbach:很抱歉重复一遍,但是当您想获得帮助时,请不要隐藏您拥有的所有相关信息。我们不是来玩游戏的,不是吗?有了您提供的信息,我的上述答案恐怕就可以帮助您了。
【解决方案2】:

一个可能的区别可能是很少使用/理解/故意选择的 uiAccess 属性。您能否创建两个清单,一个为 uiAccess=false,一个为 uiAccess=true,然后告诉我们其中一个是否与您在右键单击运行时看到的行为相同?

【讨论】:

  • 如果是这样,那么@Daniel Stutzbach 真的应该为没有告诉我们他的应用程序在做什么或做得不对而感到羞耻。但是,据我了解,此设置在这里应该没有任何影响。将 uiAccess 设置为 true 允许应用程序与桌面上更高权限的窗口对话,但由于它已经以最高权限运行,因此应该没有更高权限的窗口。
  • 现在我正在使用 uiAccess=false。我会尝试 uiAccess=true 并报告。
  • 如果 uiAccess=true,requireAdministrator 的行为与之前相同。但是,“以管理员身份运行”改变了行为以匹配 requireAdministrator。 *困惑*
  • @Daniel 所以也许是时候弄清楚您认为的差异是什么了?您可能刚刚运行了该应用的两个版本。
  • @Daniel Stutzbach:你能同时解决这个问题吗?或者你会更新吗?
【解决方案3】:

RemoteHooking 类的 IsAdministrator 属性的 EasyHook 文档提到:

由于 Windows Vista 上的 UAC,即使用户在 builtin-admin 组中,此属性通常也会为 false。由于没有管理员权限就无法挂钩,因此您只需将应用程序的 UAC 级别设置为 requireAdministrator。

很难想象为什么会发生这种情况,但可以想象(尤其是当您看到它发生时!)资产、流程、程序集等,可能具有不同的信任级别等,不会继承你的主要应用程序。设置 requireAdministrator 标志可以在整个资源和依赖关系范围内全局处理/强制执行此操作。很想知道结果如何。

【讨论】:

    【解决方案4】:

    我认为我也看到了这些之间的差异。然而,事实证明,就我而言,问题是这样的:

    当我在文件浏览器 (Q-Dir) 中单击“以管理员身份运行”时,工作目录与我尝试双击清单中设置了 requireAdministrator 的应用程序时不同。这改变了我收到的一些有问题的 DLL 的行为。事实上,事实证明,我看到的 100% 的差异是由于从不同的工作目录运行(具体来说,无论我是在 C: 驱动器还是不同的驱动器号上都很重要)以及让程序运行的方法因为管理员与它无关。

    这是一个特定于我的计算机的确切配置的问题,但它可能是关于可能发生的事情类型的线索(或者可能发生在 7 年前......)

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2013-12-14
      • 2012-11-22
      • 2016-09-20
      • 2010-11-26
      • 2012-05-28
      相关资源
      最近更新 更多