я показал мой исполняемый файл как администратор с требованием:
<?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
; как будто временная копия была сделана, и она запускается:
альтернативный текст http://i42.tinypic.com/nmkppz.jpg
Я выкопал Process Montior, чтобы узнать, создает ли кто-нибудь файл *. Tmp , когда я запускаю свой исполняемый файл, и есть:
альтернативный текст http://i42.tinypic.com/10o1b8g.jpg
Служба Информация о приложении внутри этого конкретного контейнера svchost
намеренно копирует мой исполняемый файл во временную папку Windows и запрашивает оттуда пользователя «Согласие»; давая неверное имя файла.
После получения согласия исполняемый файл запускается из исходного местоположения:
текст ссылки http://i43.tinypic.com/104noub.jpg
Файл не копируется во временную папку, если я не подписал его цифровым способом:
альтернативный текст http://i43.tinypic.com/14kvevd.jpg
Так что моя проблема в том, что неверное имя файла появляется в диалоговом окне согласие , когда я ставлю цифровую подпись мой исполняемый файл, который проявляется как requireAdministrator
.
Что делать?
Обновление:
Самое близкое объяснение, которое я могу найти, взято из Uninformed.org (http://uninformed.org/index.cgi?v=8&a=6&p=3):
В случае запроса на запуск
программа, запрашивающая uiaccess,
appinfo! RAiLaunchAdminProcess is
позвонил на обслуживание запроса.
Затем процесс проверяется на
(жестко закодированный) набор разрешенных
каталоги по
AppInfo! AiCheckSecureApplicationDirectory .
После проверки, что программа
запускается из допустимого
каталог, контроль в конечном итоге
передано в appinfo! AiLaunchProcess
который выполняет оставшуюся работу
необходимо для обслуживания запуска
запрос. На данный момент, из-за
«безопасный» каталог приложений
требование, это не возможно для
ограниченный пользователь (или пользователь, работающий с
низкая целостность, если на то пошло)
поместите пользовательский исполняемый файл в любой из
«безопасные» каталоги приложений.
Подсказка - это некоторые (недокументированные, неуказанные) жестко закодированные пути, в которых «разрешено» находиться приложению.
Другое - для программы, запрашивающей uiaccess . В моем случае у меня не было uiAccess="false"
в моем первоначальном манифесте. Но изменив манифест, включив в него доступ без пользовательского интерфейса:
Но это не устранило исходную проблему.
Обновление два:
Из MSDN ():
Важно
Приложения с
Флаг uiAccess, установленный в true, должен быть
Authenticode подписан, чтобы начать правильно.
Кроме того, приложение должно
проживать в защищенном месте в
файловая система. \ Program Files \ and \ windows \ system32 \
в настоящее время это два допустимых защищенных местоположения.
Это похоже на то, что исполняемый файл, запрашивающий uiAccess
, должен находиться в разрешенном месте; за исключением того, что я не прошу uiAccess.