Воспроизведение заблокированной опции «разблокировать» exe в свойствах файла в Windows 2003
-
02-07-2019 - |
Вопрос
Когда я загружаю свою программу со своего веб-сайта на свой компьютер с Windows 2003, она заблокирована, и вам нужно щелкнуть правой кнопкой мыши по exe, затем «Свойства», затем выбрать кнопку «Разблокировать».
Я хотел бы добавить в свой установщик обнаружение случаев, когда файл заблокирован и, следовательно, не имеет достаточных разрешений.
Но я не могу легко воспроизвести получение моего exe в таком состоянии, когда его необходимо разблокировать.
Как я могу добиться, чтобы разблокировка появилась в моем exe, чтобы я мог протестировать эту функцию?
Решение
Это делается с помощью файловых потоков NTFS.К загруженным файлам добавлен поток с именем «Zone.Identifier».Когда IE7 загружает определенные типы файлов, этот поток содержит:
[ZoneTransfer]
ZoneId=3
Самый простой способ установить его — создать текстовый файл с этим содержимым и использовать его для добавления в альтернативный поток.
Зона.Идентификатор.txt:
[ZoneTransfer]
ZoneId=3
Команда:
more Zone.Identifier.txt > file.exe:Zone.Identifier
Затем вы можете проверить это, если попытаетесь открыть поток Zone.Identifier и найти ZoneId=3 или просто предположить, что, если поток вообще существует, ваш пользователь получит это предупреждение.
Также важно отметить, что это не имеет ничего общего с разрешениями.Администраторы видят то же предупреждение;это полностью зависит от источника и типа файла.Весь поток исчезает, когда пользователи снимают флажок «Всегда спрашивать перед открытием этого файла» и затем нажимают «Выполнить».
Другие советы
Для этого существует поддерживаемый API, описанный в MSDN.Найдите в MSDN «Объект идентификатора постоянной зоны».В основном вы CoCreateInstance
с CLSID_PersistentZoneIdentifier
и запросить IPersistFile
интерфейс.Затем вы позвоните IPersistFile::Load
с именем рассматриваемого файла.Далее, QI для IZoneIdentifier
интерфейс и использование IZoneIdentifier::GetId
чтобы получить зону файла.Если не было «метки паутины», следует получить URLZONE_LOCAL_MACHINE
.ZoneId 3, упомянутый в другом ответе, равен URLZONE_INTERNET
.(Перечисление называется URLZONE
а также документировано в MSDN или см. sdk\inc\urlmon.h
.) Удалить или изменить "знак сети" можно позвонив IZoneIdentifier::Remove
или IZoneIdentifier::SetId
а потом позвони IPersistFile::Save
.Более подробную информацию обо всем этом можно найти на MSDN.Удачи!
Спасибо за это, это мне очень помогло.
Вы можете сделать процесс еще проще, если создадите пакетный файл с содержимым.
echo [ZoneTransfer] > Zone.Identifier
echo ZoneId=3 >> Zone.Identifier
more Zone.Identifier > %1:Zone.Identifier
Это создаст для вас Zone.Identifier и соответствующим образом пометит файл.
Чтобы запустить его, просто укажите имя файла, например.если файл называется mark.bat
mark.bat myfile.txt