在 Windows 服务器上(我测试了 2008 R2 和 2012 R2),我们注意到从批处理调用的 Perl 脚本的执行有不同的行为。
考虑如下原始批处理文件:
:beginlbl
call path\script.pl
goto :beginlbl
迟早(有时在数百次执行后仅执行几次脚本后)会出现错误消息: “Windows 无法访问指定的设备、路径或文件。您可能没有适当的权限来访问该项目。”
如果将第二行代码修改为如下所示:
call perl path\script.pl
(注意脚本前的可执行文件名。)脚本将永远运行而不会出现问题。
在上述两种情况下,Windows 的执行方式有何不同?
使用文件关联会通过一个 shell 进程来评估文件类型(扩展名)并启动适当的进程。你可能压倒了这一点。这类似于调用 .txt 时获取注册编辑器的方式。另请参见 ShellExecute。
直接调用可执行文件可以省去中间人,而且总是首选。
Uslackr 对您原始问题的评论也是正确的,他指出系统路径上的 perl 可执行文件已被调用。您最好直接指定您希望通过完整路径运行的可执行文件,以避免意外调用另一个可执行文件。这对可靠性和安全性都有好处。牺牲了可移植性,但您可以选择优先级。
我将马修的回答标记为正确,因为我分享了他应该如何实施它的观点。实际上,我们继承了我们支持的系统,而最佳案例解决方案并不是我们所拥有的。改变/改进它是另一回事。
今天我们知道我们的问题是由糟糕的 Crowdstrike 传感器引起的。基本上,这个间谍软件对 Windows 造成了严重破坏。可悲的是 a) Windows 事件日志中没有任何痕迹 b) Crowdstrike 自己的控制台中没有任何干扰痕迹。
可悲的是,供应商希望我们解决他们自己的软件问题,而我的老板不付钱给我。