Воспроизведение заблокированной опции «разблокировать» exe в свойствах файла в Windows 2003

StackOverflow https://stackoverflow.com/questions/135600

Вопрос

Когда я загружаю свою программу со своего веб-сайта на свой компьютер с 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top