我将我的可执行文件显示为需要管理员:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<!-- Disable Windows Vista UAC compatability heuristics -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
然后我对其进行了数字签名。
但是当我运行可执行文件时,我注意到一些奇怪的事情:同意对话框上的可执行文件的名称从更改PingWarning.exe
为pinxxxx.tmp
;好像制作了一个临时副本,并且正在运行:
我挖出了 Process Montior,看看是否有人在我启动我的可执行文件时创建了*.tmp文件,并且有:
此特定容器内的应用程序信息服务有意将我的可执行文件复制到 Windows 临时文件夹,并从那里请求用户“同意”;给出一个无效的文件名。svchost
如果我不对其进行数字签名,则该文件不会复制到临时文件夹:
所以我的问题是当我对我的可执行文件进行数字签名时出现在同意对话框中的无效文件名已显示为.requireAdministrator
做什么?
更新:
我能找到的最接近解释的东西来自Uninformed.org :
打破经纪人
在请求 uiaccess 的程序的启动请求的情况下, 调用appinfo!RAiLaunchAdminProcess来为请求提供服务。然后验证该过程是否在appinfo!AiCheckSecureApplicationDirectory允许的目录集(硬编码)内 。在验证程序是从允许的目录中启动后,控制权最终传递给appinfo!AiLaunchProcess ,它执行为启动请求提供服务所需的剩余工作。此时,由于“安全”应用程序目录要求,受限用户(或以低完整性运行的用户,就此而言)不可能将自定义可执行文件放置在任何“安全”应用程序目录中。
提示是一些(未记录的、未指定的)硬编码路径,应用程序被“允许”位于其中。
另一个是用于请求 uiaccess 的程序。就我而言uiAccess="false"
,我的原始清单中没有。但是更改清单以包含无 ui 访问权限:
但这并没有解决原来的问题。
更新二:
来自MSDN:
SendSAS 函数
重要uiAccess标志设置为 true 的应用程序必须经过 Authenticode签名才能正常启动。此外,应用程序必须驻留在文件系统中受保护的位置。目前,有两个允许的受保护位置:
- **\程序文件**
- **\windows\system32**
这似乎支持了可执行请求uiAccess
必须位于允许的位置的概念。除了我不要求 uiAccess。