Воспроизведение заблокированного exe-параметра «разблокировать» в свойствах файла в Windows 2003 - PullRequest
7 голосов
/ 25 сентября 2008

Когда я загружаю свою программу со своего веб-сайта на мой компьютер с Windows 2003, на нем есть блок, и вы должны щелкнуть правой кнопкой мыши на exe, затем в свойствах, затем выбрать кнопку «Разблокировать».

Я хотел бы добавить обнаружение в мой установщик для случая, когда файл заблокирован и, следовательно, не имеет достаточных разрешений.

Но я не могу легко воспроизвести мой exe в этом состоянии, где его нужно разблокировать.

Как я могу получить разблокировку на моем exe-файле, чтобы я мог проверить эту функциональность?

Ответы [ 3 ]

20 голосов
/ 26 сентября 2008

Это делается с помощью файловых потоков NTFS. К загруженным файлам добавлен поток с именем «Zone.Identifier». Когда IE7 загружает определенные типы файлов, этот поток содержит:

[ZoneTransfer]
ZoneId=3

Самый простой способ установить его - создать текстовый файл с таким содержимым и использовать more для добавления его в альтернативный поток.

Zone.Identifier.txt:

[ZoneTransfer]
ZoneId=3

Команда:

more Zone.Identifier.txt > file.exe:Zone.Identifier

Тогда вы можете проверить это, попытавшись открыть поток Zone.Identifier и найти ZoneId = 3, или просто предположить, что, если поток вообще существует, ваш пользователь получит это предупреждение.

Также важно отметить, что это не имеет никакого отношения к разрешениям. Администраторы видят то же предупреждение; это связано исключительно с источником и типом файла. Весь поток пропадает, когда пользователи снимают флажок «Всегда спрашивать перед открытием этого файла» и затем нажимают «Выполнить».

11 голосов
/ 06 ноября 2008

Для этого существует поддерживаемый API, задокументированный в MSDN. Поиск в MSDN для «объекта идентификатора персистентной зоны». В основном вы CoCreateInstance с CLSID_PersistentZoneIdentifier и запрашиваете IPersistFile интерфейс. Затем вы звоните IPersistFile::Load с именем файла, о котором идет речь. Затем введите QI для интерфейса IZoneIdentifier и используйте IZoneIdentifier::GetId для получения зоны файла. Если не было «знака сети», вы должны получить URLZONE_LOCAL_MACHINE. Зональный идентификатор 3, упомянутый в другом ответе, равен URLZONE_INTERNET. (Перечисление называется URLZONE и также задокументировано в MSDN, или см. sdk\inc\urlmon.h.) Вы можете удалить или изменить «метку сети», позвонив IZoneIdentifier::Remove или IZoneIdentifier::SetId, а затем позвонив IPersistFile::Save. Есть все подробности обо всем этом на MSDN. Удачи!

1 голос
/ 13 июня 2012

Спасибо за это, это мне очень помогло.

Вы можете сделать процесс еще проще, если создадите командный файл с содержимым.

echo [ZoneTransfer] > Zone.Identifier
echo ZoneId=3 >> Zone.Identifier
more Zone.Identifier > %1:Zone.Identifier

Это сгенерирует для вас Zone.Identifier и пометит файл соответствующим образом.

Для запуска просто укажите имя файла, например, если файл называется mark.bat

mark.bat myfile.txt
...