Как подписать пакетный файл Windows (.bat)?

8

У меня Windows 7, и когда я пытаюсь запустить командный файл, он говорит: «Не удалось проверить издателя. Вы уверены, что хотите запустить это программное обеспечение?»

Поэтому, когда я пытаюсь подписать его с помощью сертификата для подписи кода, появляется сообщение «Ошибка SignTool. Этот формат файла не может быть подписан, поскольку он не распознан».

Так что я застрял между скалой и трудным местом. Есть ли способ устранить любое сообщение?

Скриншот


источник
1
Переписать его как скрипт PowerShell и подписать? Я никогда не слышал о подписанных пакетных файлах.
Изи
Вы не подписываете пакетные файлы. Похоже, ваш пакетный файл вызывает что-то еще, что должно быть подписано.
Марк Аллен
1
Каков источник приглашения? То есть что такое заголовок и иконка? Это на самом деле приглашение Windows или приглашение сторонней программы безопасности? Сделайте скриншот и добавьте его к вопросу.
Synetech
@SeanCheshire, если это так, то Techturtle это правильно; Windows просматривает все подозрительные данные в сети, поэтому вам нужно будет либо скопировать их локально, либо добавить местоположение в доверенную зону.
Synetech

Ответы:

4

Я получаю похожее сообщение, если запускаю командные файлы (или другие исполняемые файлы) из сетевого расположения. Если это так, вы можете рассмотреть возможность перемещения его на локальный диск. Другой альтернативой является использование отдельного командного файла на локальном диске для его запуска в сети. Запускающий пакетный файл должен содержать только одну строку:

@call \\network\folder\batch.bat

Windows не будет отказываться от локального файла, и, как только этот файл будет запущен, он может без проблем вызвать сетевую версию.

techturtle
источник
@Sosukodo, так E:это сетевой диск?
Synetech
Вроде ;-) Я управляю гостем VirtualBox Windows 7 на хосте Mac. E: является общей папкой VirtualBox. Я не знал, что общая папка будет считаться сетевым диском, но когда вы упомянули об этом, это имело смысл.
4

Вы не подписываете пакетные файлы. Похоже, ваш пакетный файл вызывает что-то еще, что должно быть подписано.

Изменить: Теперь, когда вы разместили пакетный файл, мы можем видеть, что это из-за сетевого расположения. Или иногда это происходит, если вы просто копируете файл из сетевого расположения. В последнем случае это связано с тем, что Windows пометила файл через альтернативный поток данных, чтобы он находился в какой-то другой зоне Интернета. Вы можете обойти это одним из двух способов:

  1. Измените зоны безопасности в Internet Explorer для зоны интрасети.
  2. Используйте команду type, чтобы уничтожить альтернативный поток данных для файла. (Есть также streams.exe от Sysinternals, который может это сделать.) type thefile.bat > %temp%\newfile.bat & type %temp%\newfile.bat > thefile.bat
Марк Аллен
источник
3

То, что вы видите, - это общая подсказка, которую Windows предоставляет всякий раз, когда вы пытаетесь в любое время открыть загруженный файл. Что происходит, когда вы загружаете файл, он помечается флажком, который указывает, что он пришел из Интернета и поэтому потенциально опасен. Когда вы пытаетесь запустить такой файл, Windows проверяет, имеет ли он действительную подпись, чтобы определить, можно ли ему доверять.

Что вы можете сделать, это удалить флаг из файла, используя кнопку Разблокировать в свойствах файла, после чего Windows оставит вас в покое, когда вы попытаетесь запустить его:

введите описание изображения здесь


Проблема в том, что пакетные файлы - это текстовые файлы, которые могут быть выполнены. Хотя текстовый файл можно подписать, он в конечном итоге добавит в файл набор двоичных данных, который для пакетного файла плох, потому что он бессмысленный и вызовет проблемы, когда интерпретатор команд попытается его выполнить. Комментирование подписи также не будет работать, потому что тогда подпись станет поврежденной.

Поэтому подписание командного файла не будет работать.

Что вам нужно сделать, это выяснить, почему система запрашивает вас при попытке запустить его. По умолчанию Windows не запрашивает перед запуском пакетных файлов, поэтому у вас должна быть специальная политика или программа безопасности, блокирующая ее. Проверьте ваши программы безопасности, чтобы увидеть, есть ли параметр проверки, для которого вы можете отключить или добавить исключение.

Также проверьте содержимое пакетного файла, чтобы убедиться, что на нем запущен исполняемый файл, который не подписан (хотя, опять же, по умолчанию Windows не запрашивает исполняемые файлы, если он не был загружен или не требует повышенных привилегий, поэтому проверьте настройки).

Synetech
источник
Вы должны быть в состоянии выйти из сценария, прежде чем выполнение достигнет подписи, нет?
Спарр
@ Спарр, да и нет. Вы можете вставить goto :eofперед подписью, но тогда это изменит хэш файла и сделает подпись недействительной и, следовательно, файл будет поврежден / небезопасен. Я полагаю, у вас может быть строка в конце файла, прежде чем подписать его, и это должно работать. Интересный эксперимент, чтобы попробовать ...
Synetech
2
Вы можете использовать команду типа - даже для двоичных файлов - чтобы разметить файл. Я делаю это все время. введите oldfile> newfile (а затем) введите newfile> oldfile, чтобы получить старый файл без тега ADS.
Марк Аллен
Хе-хе, умный. Технически это не снимает флажок (и я не уверен, насколько он быстрее или удобнее, чем диалоговое окно « Свойства », но это работает.
Synetech
0

Вы также можете преобразовать файл .bat в скрипт PowerShell, signtool поддерживает подпись этих файлов.

Эммануэль Бург
источник
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом. - Из обзора
Бурги
@Burgi это спорно, BAT - файлы не могут быть подписаны , если кто - то пишет специальный SIP. Ближайшим решением на данный момент является подписанный скрипт PowerShell.
Эммануэль Бург
Правило № 42 Бойцовского клуба: «Обходные пути - это ответы». Так что это ответ. (Но остальные лучше.)
Скотт