UAC提示提升 - 它是如何工作的?

4

当某些安全相关操作需要执行时,Windows会在“安全桌面”上显示UAC提示。显然有某个API创建了安全桌面并在其上创建了一个窗口,但我不知道如何找到其中涉及的机制。我猜可以通过反向工程UAC机制来了解,但我不太擅长那种水平的反向工程(而且我相信这会涉及某些法律后果...)

无论如何,我知道有一个API可以在当前会话中创建新的桌面,但任何文档中都没有提到安全桌面。出于好奇,我想知道整个安全桌面/UAC提示创建过程是如何工作的。

声明:这纯粹是理论性的,我不打算在我的代码中使用它。


1
你可以查看 keepass 的源代码。在他们的最新版本2.16中,他们可以创建自己的安全桌面版本来访问数据库。从我的了解来看,这只是另一个桌面,在此过程中进行转换。 - Joshua
你可以使用CreateDesktop()创建另一个桌面,并使用SwitchDesktop()切换到该桌面。然后,您可以使用传递给CreateProcess的STARTUPINFO结构的lpDesktop成员在该桌面上创建进程。不要忘记切换回原始桌面,否则您将不得不注销才能返回。 - Luke
@Joshua Keep 要获取哪个源代码? - Mateen Ulhaq
4个回答

3

从系统的角度来看,安全桌面只是具有适当访问控制列表(ACL)的普通桌面。请注意,CreateDesktop允许您为新桌面指定安全描述符。

据我所知,安全桌面没有特殊行为,因此我认为不需要假设涉及任何其他API(无论是否记录在案)。


1

你可能已经看到了这个,但以防万一,也为了其他用户的参考,这里有一个关于UAC架构的漂亮流程图...

http://msdn.microsoft.com/en-us/library/bb756945.aspx

就UAC而言,据我所知,与特定应用程序配合使用的所有信息都在嵌入exe或dll的清单中,在链接阶段中。自从.Net更改以来,即使是非.Net应用程序也需要在其中包含清单,以告诉Windows它们不是.Net。在较新版本的Visual Studio中构建的所有内容,或者至少我构建的内容,在链接器选项的清单部分具有广泛的UAC选项,包括允许您禁用它的选项。


作为一名C#开发人员,我对清单非常熟悉 ;) 谢谢提供链接,我之前没有看到过。它解释了很多问题,只可惜没有详细说明。 - Polynomial
5
自從 .Net 變更後,即使是非 .Net 的應用程序也需要在其中包含清單,以告訴 Windows 它們不是 .Net。但這個說法是錯誤的。 - David Heffernan

0
在Windows中启动进程的方式是使用CreateProcess
CreateProcess执行3个检查,以查看应用程序是否需要提升权限:
  • 应用程序请求以管理员身份运行(requestedExecutionLevel=requireAdministrator
  • 启发式认为该应用程序可能是安装程序(例如命名为setup.exeinstaller.exeupdate.exe(可以通过组策略禁用)
  • AppCompat表示该应用程序需要提升权限
如果CreateProcess决定需要使用管理员权限启动进程,并且用户当前没有管理员权限,则会失败并返回错误:

ERROR_ELEVATION_REQUIRED(740)

ShellExecute知道如何处理这个新的错误代码

ShellExecuteCreateProcess的更高级别的包装器。它知道如何处理来自CreateProcess的这个新错误代码。

ShellExecute是调用AppInfo(应用程序信息)服务的函数。AppInfo服务启动Consent.exe,这是UAC提示。它执行提升操作。

  • 如果用户是具有管理员权限但被拒绝的管理员,则会提示进行授权
  • 如果用户是标准用户,则会提示输入凭据

AppInfo启动新进程,然后ShellExecute返回。

来源


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接