我编写了一个包含requireAdministrator的清单程序。在启用了UAC的Windows 7系统上,Windows会弹出一个请求权限的对话框。效果很好。
如果用户通过右键单击并选择“以管理员身份运行”来启动我的程序,则Windows 7也会弹出一个询问权限的对话框。但是,我的程序在我的程序的一些更深奥的部分中的运作方式略有不同。
那么“以管理员身份运行”和使用requireAdministrator的清单之间有什么区别?任何描述差异的文档链接都将受到赞赏。
修改:这是启用UAC的。
编辑:正如下面所承诺的那样,是我所看到的差异的完整解释。
我正在使用EasyHook library将DLL注入另一个进程。当我的应用程序以“以管理员身份运行”运行时,注入的进程崩溃,EasyHook返回错误“注入的汇编程序代码中的未知错误”。我的DLL中没有任何代码有机会执行;崩溃发生在那之前。 (此外,即使我将DLL删除为空,也会发生崩溃)
如果我正常运行我的程序(即通过requireAdministrator提升),一切正常。
我的应用程序由几个不同的可执行文件组成。用户启动的过程与执行注入的过程不同。
答案 0 :(得分:3)
根据给出的信息,两个进程之间的权限没有差异。
如果您通过应用程序清单请求“requireAdministrator”执行级别,您的应用程序将使用管理员的完全访问权限启动,或者如果用户拒绝同意则根本不启动(请参阅 Create and Embed an Application Manifest (UAC) 了解更多信息)。
当用户选择以管理员身份运行时,也会发生相同的情况。
唯一的区别是流程的启动方式。从shell启动可执行文件时,例如通过在资源管理器中双击或从上下文菜单中选择以管理员身份运行,shell将调用ShellExecute
以实际启动流程执行。整个提升过程隐藏在此功能中。 Kenny Kerr在 Windows Vista for Developers – Part 4 – User Account Control :
ShellExecute首先调用CreateProcess来尝试创建新进程。 CreateProcess执行检查应用程序兼容性设置,应用程序清单,运行时加载程序等的所有工作。如果确定应用程序需要提升但调用进程未提升,则CreateProcess将失败并返回ERROR_ELEVATION_REQUIRED。然后,ShellExecute调用Application Information服务来处理提升提示和创建提升的进程,因为调用进程显然没有执行此类任务所需的权限。 Application Information服务最终使用不受限制的管理员令牌调用CreateProcessAsUser。
另一方面,如果您想要创建一个提升的进程而不管可用的应用程序信息是什么,那么您可以使用ShellExecute指定鲜为人知的“runas”动词。无论应用程序的清单和兼容性信息可能规定什么,这都具有请求提升的效果。 runas动词实际上并不是Windows Vista的新功能。它在Windows XP和Windows 2003上可用,通常用于直接从shell创建受限令牌。然而,这种行为已经改变。这是一个简单的例子:
::ShellExecute(0, // owner window L"runas", L"C:\\Windows\\Notepad.exe", 0, // params 0, // directory SW_SHOWNORMAL);
因此,基本上使用以管理员身份运行选项启动可执行文件意味着ShellExecute
会绕过对兼容性设置,应用程序清单等的检查并直接请求提升。
Kenny Kerr的文章还提供了示例代码,用于使用OpenProcessToken
函数查询当前进程的令牌以获取其权限。可能您可以使用该示例来确定您的流程升级方式没有差异。
我非常想知道你所观察到的差异,因为我强烈怀疑它们与海拔有关。
作为最后一件事:您能否仔细检查您是否确实要求 requireAdministrator 级别而不是错误地只是 highestAvailable 的级别?
答案 1 :(得分:1)
一个可能的差异可能是很少使用/理解/故意选择的uiAccess属性。你能创建两个清单,一个用uiAccess = false,另一个用uiAccess = true,然后告诉我们其中一个清单是否给出了你用右键单击run-as-admin看到的相同行为?
答案 2 :(得分:1)
RemoteHooking类'IsAdministrator属性的EasyHook文档提及:
由于Windows Vista上的UAC,即使用户位于内置管理员组中,此属性也将为false。由于您无法在没有管理员权限的情况下挂钩,因此您只需将应用程序的UAC级别设置为requireAdministrator。
很难想象为什么会发生这种情况,但可以想象(特别是当你看到它发生时!)资产,流程,程序集,以及可能具有不同信任等级等等,都不会继承主应用程序的提升。设置requireAdministrator标志可以在整个资源和依赖项范围内全局处理/强制执行此操作。很想知道结果如何。
答案 3 :(得分:0)
我以为我也看到了它们之间的区别。但事实证明,就我而言,问题是:
当我从文件浏览器(Q-Dir)单击“以管理员身份运行”时,工作目录与我尝试简单地双击清单中设置了requireAdministrator
的应用程序时不同。这改变了我收到的一些错误DLL的行为。事实上,事实证明,我看到100%的差异是由于从不同的工作目录运行(具体而言,无论我是在C:驱动器还是不同的驱动器号上都很重要)以及让程序运行的方法管理员与此无关。
这是一个特定于我的计算机确切配置的问题,但它可能是一种可能发生的事情的线索(或者可能发生在7年前......)。