我将我的可执行文件表示为需要管理员:
<?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
;好像制作了一个临时副本,并且正在运行:
alt text http://i42.tinypic.com/nmkppz.jpg
我挖出了Process Montior,看看是否有人在我启动可执行文件时创建 * .tmp 文件,并且有:
alt text http://i42.tinypic.com/10o1b8g.jpg
此特定svchost
容器中的应用程序信息服务故意将我的可执行文件复制到Windows临时文件夹,并从那里请求用户“同意” ;提供无效的文件名。
一旦获得同意,可执行文件将从其原始位置运行: link text http://i43.tinypic.com/104noub.jpg
如果我没有对其进行数字签名,则不会将文件复制到临时文件夹:
alt text http://i43.tinypic.com/14kvevd.jpg
所以当我对我的可执行文件进行数字签名时,我的问题是同意对话框中出现的无效文件名已表现为{{1 }}
做什么?
更新
我能找到的最接近的解释来自Uninformed.org(http://uninformed.org/index.cgi?v=8&a=6&p=3):
对于a的启动请求 请求uiaccess的程序, appinfo!RAiLaunchAdminProcess 是 被叫来服务请求。该 然后验证过程在...内 (硬编码)允许的一组 目录 APPINFO!AiCheckSecureApplicationDirectory 的。 验证程序后 从允许的范围内发射 目录,最终控制 传递给 appinfo!AiLaunchProcess 执行剩余的工作 为发射服务所必需的 请求。此时,由于 “安全”应用程序目录 要求,这是不可能的 有限的用户(或运行的用户) 低完整性,就此而言) 在任何一个中放置自定义可执行文件 “安全”应用程序目录。
提示是一些(未记录的,未指定的)硬编码路径,应用程序“被允许”位于其中。
另一个是用于请求uiaccess的程序。在我的情况下,我的原始清单中没有requireAdministrator
。但是改变清单包括no ui access:
但这并没有解决原来的问题。
更新二:
来自MSDN():
重要
应用程序 uiAccess标志设置为true必须是 Authenticode签名正确启动。 此外,应用程序必须 居住在受保护的地方 文件系统。 \ Program Files \和\ windows \ system32 \
目前是两个受允许的受保护地点。
这似乎可以替代请求uiAccess="false"
的可执行文件必须位于允许位置的概念;除了我没有要求uiAccess。
答案 0 :(得分:2)
我看到了未签名的应用程序存在同样的问题,特别是NSIS和InnoSetup安装程序(当1gb +安装程序被复制到%windir%\ temp然后由consent.exe扫描时有点问题)
NSIS错误跟踪器有一个entry。回到我调查的时候,我和@ MS的某个人联系过,他们应该联系那些在UAC工作过的人,但没有真正想到的。我从该对话中获得的唯一适用信息就是这句话:
Windows中的一位朋友有一个模糊的回忆,这可能是一个 在信任对话框出现时减轻对文件篡改的担忧 显示