Наверняка почти каждый из вас сталкивался с ситуацией, когда исполняемый файл установщика какой-либо программы, скачанный из интернета, отказывался запускаться просто так. Вместо этого Windows выкидывала предупреждение о безопасности, мол, вы действительно хотите запустить файл krutayaproga.exe от неизвестного издателя, или всё-таки подумаете. Разумеется, можно нажать “Да”, да ещё и поставить флаг, мол, больше не спрашивать, но проблему это не решит и, когда вы скачаете программу с другого сайта, вы снова увидите этот запрос. Знаю многих людей, которые пытались отключить это дело через реестр, отключение SmartScreen и защитника Windows, однако, не знаю, помогло ли им это. Точно знаю, что в таких случаях помогает копирование такого файла на флешку, отформатированную в fat32 и обратно. Однако, во-первых, бывают установщики и размером более 4 гб, так что на fat32 они просто не влезут, а во-вторых это навело меня на кое-какие размышления, о которых я напишу ниже.
И так, раз при копировании на флешку и обратно это гадливое предупреждение исчезает, значит дело тут в файловой системе ntfs, вернее в том, что в ней есть что-то такое, чего нет в fat32 и что безвозвратно теряется при копировании с тома ntfs на том fat32. Имена в юникоде? Да, их нет в fat32, но англоязычные имена файлов всё равно порождают это гадливое предупреждение. Иной способ организации хранения файлов? Журналирование? Индексирование? Двоичные деревья? Всё оно не подходит к нашему случаю. Так что же подходит? А вот что. в ntfs появилось новое понятие – файловые потоки (file streams). Любой файл на томе ntfs может содержать кроме основного потока сколько угодно иных потоков. Проведите эксперимент. Для этого очень желательно, чтобы у вас был Total Commander.
- Войдите в любую папку и создайте в ней файл test.txt, например, по комбинации клавиш shift+f4;
- Откройте его и что-нибудь напишите, например, “это первый тест;
- Сохранитесь;
- Теперь нажмите shift+f4, сотрите всё, что там написано, и напишите вот так: test.txt:test2, после чего нажмите enter;
- В открывшемся пустом окне редактора напишите что-нибудь, например, “Это второй тест”;
- Теперь проделайте то же самое, что и во втором пункте, только после двоеточия напишите test3 вместо test2;
- Снова откроется пустое окно редактора, в котором вы можете написать, например, “Это третий тест”.
Что получилось после наших экспериментов? Получилось то, что наш файл test.txt имеет три файловых потока:
- Поток по умолчанию, который сформировался при создании файла и в котором мы написали “Это первый тест”;
- Поток с именем test2, в котором мы написали “Это второй тест”;
- Поток с именем test3, в котором мы написали “Это третий тест”.
После примера с файловыми потоками, думаю, вы уже догадались, что при скачивании файлов из интернета, система добавляет к ним какой-то файловый поток и, если Windows “видит” такой поток у исполняемых файлов, то при запуске на выполнение такого exe-шника она обязательно будет “ругаться.
Что же это за поток? Сведения о том, откуда конкретно был скачан файл, Windows сохраняет в потоке “zone identifier”. Для примера перед написанием этого поста я скачал с официального сайта последнюю версию архиватора 7zip. Давайте посмотрим, что содержится в потоке zone.identifier.
[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://www.7-zip.org/download.html
HostUrl=https://www.7-zip.org/a/7z1900.exe
Вот на это всё и “Ругается” Windows. Отсюда вывод: чтобы не заниматься глупостями с копированием на флешку и обратно и при этом сделать так, чтобы Windows не “ругалась на скачанные файлы, поток zone.identifier надо удалить. Как это сделать? Есть два способа. Способ безопасный:
- скачайте и установите, если ещё не установили, архиватор 7zip;
- Откройте приложение 7Zip file manager;
- Найдите в нём файл, скачанный из интернета;
- Вызовите контекстное меню файла и откройте пункт “Альтернативные потоки”;
- Найдите поток zone identifier и удалите его, нажав клавишу delete.
Второй способ: открыть поток в ручную и удалить всё, что там написано. Показываю на примере Total Commander-а.
- Найдите тоталом скачанный файл;
- Находясь на нём, нажмите shift+f4;
- Переместитесь в конец строки, поставьте двоеточие и напишите zone.identifier;
- Нажмите enter;
- В открывшемся окне редактора нажмите ctrl+a и за тем delete, чтобы выделить весь текст и удалить его;
- Сохранитесь.
Всё, вы только что удалили штуку, из-за которой Windows “Ругалась на файлы, скачанные из интернета.
Вообще же… Файловые потоки – очень интересная вещь, с ними можно делать много чего интересного. Если интересно, что же именно с ними можно делать, спрашивайте, отвечу.