如何签名Windows批处理(.bat)文件?


8

我正在运行Windows 7,当我尝试运行批处理文件时,它显示“无法验证发布者。确定要运行此软件吗?”

因此,当我尝试使用代码签名证书对其进行签名时,它会显示“ SignTool错误:无法识别此文件格式,因为无法识别。”

所以我被困在一块岩石和一个困难的地方之间。有没有消除任何一条消息的方法?

屏幕截图


1
将其重新编写为PowerShell脚本并签名?我自己从未听说过签名的批处理文件。
Iszi 2012年

您不签署批处理文件。听起来您的批处理文件正在调用其他应签名的内容。
Mark Allen

1
提示的来源是什么?也就是说,标题栏和图标是什么?它实际上是Windows提示符还是来自第三方安全程序的提示符?截屏并将其添加到问题中。
Synetech


@SeanCheshire,如果真是这样,那么techturtle是正确的;Windows会以可疑的眼光查看网络上的任何内容,因此您将需要在本地复制它或将位置添加到“受信任的区域”。
Synetech

Answers:


4

如果我从网络位置运行批处理文件(或其他可执行文件),也会收到类似的消息。在这种情况下,您可能需要考虑将其移动到本地驱动器。另一种选择是在本地驱动器上使用单独的批处理文件以在网络上启动该文件。启动批处理文件只需要一行:

@call \\network\folder\batch.bat

Windows不会对本地文件感到厌烦,并且该文件运行后,它可以调用网络版本而不会出现问题。


@Sosukodo,因此E:是网络映射的驱动器吗?
Synetech

排序;-)我正在Mac主机上运行VirtualBox Windows 7 guest虚拟机。E:是VirtualBox共享文件夹。我不知道共享文件夹将被视为网络驱动器,但是当您提到它时,它是有道理的。

4

您不签署批处理文件。听起来您的批处理文件正在调用其他应签名的内容。

编辑:现在您已经发布了一个批处理文件,我们可以看到这是由于网络位置。或者,有时候,如果您仅从网络位置复制文件,就会发生这种情况。在后一种情况下,这是因为Windows已通过“备用数据流”将文件标记为位于其他Internet区域中。您可以通过以下两种方法之一来解决:

  1. 在Internet Explorer中,将Intranet区域更改为安全区域。
  2. 使用type命令销毁该文件的备用数据流。(还有来自Sysinternals的streams.exe可以做到这一点。) type thefile.bat > %temp%\newfile.bat & type %temp%\newfile.bat > thefile.bat

3

您会看到的是Windows会在您每次尝试打开已下载文件的任何时间时提供的常规提示。发生的情况是,当您下载文件时,该文件会带有标记,表明该文件来自Internet,因此具有潜在的危险。当您尝试运行这样的文件时,Windows会检查它是否具有有效的签名,以确定它是否可以信任。

您可以做的是通过使用文件属性中的“ 取消阻止”按钮从文件中删除标志,此后,无论何时您尝试运行它,Windows都会让您独自一人:

在此处输入图片说明


问题是批处理文件是可以执行的文本文件。虽然可以对文本文件进行签名,但最终将向该文件中添加一堆二进制数据,这对于批处理文件是不好的,因为它是乱码,并且在命令解释器尝试执行它时会引起问题。注释掉签名也不起作用,因为签名随后会损坏。

因此,签名批处理文件将无法正常工作。

您需要做的是弄清楚为什么系统在尝试运行时会提示您。默认情况下,Windows在运行批处理文件之前不询问,因此您必须具有特殊的策略或安全程序来阻止它。检查您的安全程序,以查看是否存在可以禁用或添加排除项的验证设置。

还要检查该批处理文件的内容,以查看它是否正在运行未签名的可执行文件(尽管同样,默认情况下,Windows不会提示您输入可执行文件,除非已下载该文件或需要提升的特权,因此请检查设置)。


您应该能够在执行到达签名之前退出脚本,不是吗?
Sparr 2012年

@Sparr,是和不是。您可以goto :eof在签名之前插入,但是这样会改变文件的哈希值,并使签名无效,从而使文件损坏/不安全。我想您可以在对文件进行签名之前在文件的末尾找到该行,它应该可以工作。尝试有趣的实验…
Synetech

2
您甚至可以在二进制文件上使用type命令来取消标记文件。我一直都在做。键入oldfile> newfile(然后)键入newfile> oldfile,结果是没有ADS标记的oldfile。
Mark Allen

呵呵,聪明。这不是技术上剥离标志(我不知道有多少更快或更方便的是比属性对话框,但它的作品。
Synetech

0

您也可以将.bat文件转换为PowerShell脚本,signtool支持对这些文件进行签名。


这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。- 评论
布尔吉

@Burgi这值得商bat,除非有人编写专用的SIP,否则无法对.bat文件进行签名。目前最接近的解决方案是签名的PowerShell脚本。
伊曼纽尔·布尔格

搏击俱乐部的规则#42是“解决方法就是答案”。所以这是一个答案。(但其他方法更好。)
斯科特(Scott
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.