UAC提示提升-它是如何工作的
UAC prompt elevation - how does it work?
Windows在执行安全相关操作时,会在"安全桌面"中显示UAC提示。显然在某个地方有一些API可以创建安全桌面并在其上创建一个窗口,但我不知道在哪里可以找到相关的机制。我想我可以对UAC机制进行逆向工程,但我不太擅长逆向工程(而且我很确定这涉及到一些法律后果……)
无论如何,我知道有一个API可以在当前会话中创建新桌面,但是在我能找到的任何文档中都没有提到安全桌面。出于好奇,我想知道整个安全桌面/UAC提示创建是如何工作的。免责声明:这纯粹是理论上的,我不打算在我的任何代码中部署它
从系统的角度来看,安全桌面似乎只是一个具有合适ACL的完全正常的桌面。请注意,CreateDesktop允许您为新桌面指定安全描述符。
据我所知,安全桌面没有特殊的行为,所以我认为没有理由假设涉及任何额外的API(文档化或不文档化)。
您可能已经看到了这一点,但为了以防万一,对于其他阅读本文的用户,这里有一个很好的UAC架构流程图....
http://msdn.microsoft.com/en-us/library/bb756945.aspx至于UAC,据我所知,UAC如何与特定应用程序一起工作的所有信息都在链接阶段嵌入在exe或dll中的清单中。
自从。net改变后,即使非。.Net应用程序需要有一个清单来告诉Windows它们不是。Net。在新版本的Visual Studio中构建的所有内容,或者至少是我所构建的内容,在链接器选项的清单部分中都有广泛的UAC选项,包括允许您禁用它的选项。
有一个UAC克隆的源代码也可以在XP上工作。它被称为SuRun,包含了一些更多的功能,比如针对特定应用程序的自动提升。
博客和文档是德文的:http://kay-bruns.de/wp/software/surun德语文档包含大量详细信息:http://kay-bruns.de/download/SuRun1209.pdf
Sourceforge页面:http://sourceforge.net/projects/surun/它是c++
在Windows中启动进程的方式是使用CreateProcess。
CreateProcess执行3个检查来查看应用程序是否需要提升:
- 应用程序要求运行升高(
requestedExecutionLevel=requireAdministrator
) - 启发式认为应用程序可能是一个安装程序(例如命名为
setup.exe
,installer.exe
,update.exe
)(可以通过组策略禁用) - AppCompat说这个糟糕的应用程序需要被提升
如果CreateProcess决定进程需要以管理员权限启动,而用户当前没有管理员权限,则失败并返回错误:
ERROR_ELEVATION_REQUIRED
(740)
ShellExecute知道如何处理这个新的错误代码
ShellExecute是CreateProcess的高级包装。它知道如何处理来自CreateProcess的新错误代码。
ShellExecute是调用AppInfo(应用程序信息)服务的函数。AppInfo服务启动Consent.exe
,这是UAC提示符。它执行提升。
- 如果用户是管理员权限被拒绝,则提示进行授权
- 如果用户是标准用户,则提示输入凭据
AppInfo启动新进程,ShellExecute返回。
<标题>- 频道9:UAC -什么。如何去做。为什么。 (3/5/2007)
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?