有没有更简单的方法来检查是否已修改多个文件?

时间:2019-04-26 02:46:00

标签: powershell

我正在一个大约有40个脚本文件的项目中,我将打包脚本以将其分发给我的客户(有点像版本发布)。我不希望我的客户更改我的脚本(至少使他们难以更改)。

我通过设置执行策略将某些文件设为只读,但是客户端可以将其简单地设置回可写状态,因此我想在几行代码中添加(最好少于5行)以检查脚本是否未修改。

我知道使用属性LastWriteTime可以做到,但是我需要针对每个脚本执行此操作(用于跟踪每个文件的LastWriteTime的哈希表会很长并且不够干净),这是不理想的。

我也考虑过Get-FileHash,但我担心哈希代码每次运行都会改变。

1 个答案:

答案 0 :(得分:3)

您已经意识到,无法防止客户端以不透水的方式修改脚本。布鲁斯·施耐尔(Bruce Schneier)很好地总结了这一点:“试图使位不可复制就像在试图使水不湿一样。”

要运行一个脚本,至少需要将其复制到系统的内存中,这时您已失去控制。如何防止在备用位置复制脚本并在运行前对其进行编辑?没什么,除非您对客户有严格的控制。如果您有严格的控制权,则将执行策略设置为“签名”可防止运行未签名的脚本。直到客户端使用-Executionpolicy Bypass开关从命令行启动Powershell为止。 The execution policy isn't a security system that restricts user actions

有几种方法可能会阻碍编辑,但是坚定的黑客可以克服这些问题。因此,根本问题是:为什么?客户为什么不修改脚本?是保护一些IP吗?他们是否在尝试实现脚本不旨在实现的目标?还有吗?

一个简单的解决方案是使用PS2EXE之类的工具来将Powershell脚本转换为可执行文件。内容可以提取和修改,但是比运行记事本至少需要更多的精力。

另一种方法是模块。将脚本作为客户端将导入的Powershell模块分发。与编辑简单的脚本文件相比,编辑模块需要花费更多的精力,但也很有可能。