VB.NET运行时如何保护项目目录内文件不被删除或编辑?
如何保护项目目录中的文件避免被修改?
你提到想保护项目里的test.txt、test.bat这类文件不被修改,之前试过权限锁定和文件流锁定但效果不佳,现在的代码还只是锁定了自身进程,完全没作用在目标文件上。我来给你拆解问题,提供几个靠谱的解决方案:
先说说你现有代码的问题
你写的c_AntiKill类逻辑是修改当前进程的安全描述符,拒绝所有用户对进程的访问权限(比如终止进程)——这只能防止你的程序被杀死,和保护文件半毛钱关系都没有,所以它没法解决你的文件被修改的问题。
可行的文件保护方案
1. 改进版文件独占锁定
之前用文件流锁定没效果,大概率是没保持流的打开状态或者共享模式设置错了。正确的做法是保持文件流在程序运行期间始终打开,并设置FileShare.None,这样其他进程根本打不开这个文件进行读写。
示例代码:
Imports System.IO Public Class FileProtector ' 保存所有锁定的文件流,防止被GC回收 Private _lockedFileStreams As New List(Of FileStream) ' 锁定单个文件,按需选择访问权限 Public Sub LockTargetFile(filePath As String, allowWrite As Boolean) Try Dim accessMode As FileAccess = If(allowWrite, FileAccess.ReadWrite, FileAccess.Read) ' 打开文件,设置共享模式为None,拒绝其他进程任何访问 Dim fileStream As FileStream = File.Open( filePath, FileMode.Open, accessMode, FileShare.None ) _lockedFileStreams.Add(fileStream) Console.WriteLine($"成功锁定文件: {filePath}") Catch ex As IOException Console.WriteLine($"锁定文件失败 {filePath}: {ex.Message}") End Try End Sub ' 程序退出时释放所有锁定 Public Sub UnlockAllFiles() For Each stream In _lockedFileStreams Try stream.Close() Catch ex As Exception Console.WriteLine($"释放文件时出错: {ex.Message}") End Try Next _lockedFileStreams.Clear() End Sub ' 确保程序退出时自动解锁 Protected Overrides Sub Finalize() MyBase.Finalize() UnlockAllFiles() End Sub End Class
使用方式:在程序启动时调用LockTargetFile("test.txt", False)(如果不需要自己修改文件就传False),只要程序在运行,这个文件就被独占锁定,其他进程无法修改、删除甚至读取。
2. 加固文件权限,防止被篡改
之前的权限锁定容易被绕开,是因为没设置所有者和权限的保护规则。我们可以把文件所有者改成系统账户,同时禁止普通用户修改权限,这样即使有人想改权限解锁也很难。
示例代码:
Imports System.Security.AccessControl Imports System.Security.Principal Imports System.IO Public Sub SecureFilePermissions(filePath As String) Dim fileInfo As New FileInfo(filePath) Dim fileSecurity As FileSecurity = fileInfo.GetAccessControl() ' 将文件所有者设置为系统账户(SYSTEM),普通用户无法轻易修改所有者 Dim systemSid As New SecurityIdentifier(WellKnownSidType.LocalSystemSid, Nothing) fileSecurity.SetOwner(systemSid) ' 清除现有所有权限,重新配置 fileSecurity.PurgeAccessRules(AccessControlType.Allow) fileSecurity.PurgeAccessRules(AccessControlType.Deny) ' 给当前运行程序的用户添加必要的权限(按需调整) Dim currentUserSid As SecurityIdentifier = WindowsIdentity.GetCurrent().User fileSecurity.AddAccessRule(New FileSystemAccessRule( currentUserSid, FileSystemRights.ReadAndExecute Or FileSystemRights.Write, ' 可以只给Read权限 InheritanceFlags.None, PropagationFlags.NoPropagateInherit, AccessControlType.Allow )) ' 禁止所有用户修改文件权限和获取所有权,从根源阻止权限篡改 fileSecurity.AddAccessRule(New FileSystemAccessRule( New SecurityIdentifier(WellKnownSidType.WorldSid, Nothing), FileSystemRights.ChangePermissions Or FileSystemRights.TakeOwnership, InheritanceFlags.None, PropagationFlags.NoPropagateInherit, AccessControlType.Deny )) ' 应用权限设置 fileInfo.SetAccessControl(fileSecurity) Console.WriteLine($"已加固文件权限: {filePath}") End Sub
注意:这段代码需要管理员权限才能运行,因为修改文件所有者和权限需要高权限。
3. 双重保障:锁定+权限加固
最好的方式是同时使用上面两种方案:
- 先运行权限加固代码,给文件设置不可篡改的权限
- 再启动文件独占锁定,保持流打开
这样即使有人拿到管理员权限修改了权限,只要你的程序还在运行,文件流处于锁定状态,他们还是没法修改文件。
一些注意事项
- 独占锁定的文件流必须一直保持打开,不能中途关闭,否则锁定失效
- 如果你的程序需要多进程共享文件,独占锁定不适用,可以用
FileStream.Lock()锁定特定字节范围,但这种方式没法完全防止修改 - 权限加固需要管理员权限,所以你的程序可能需要设置UAC清单,默认以管理员身份运行
内容的提问来源于stack exchange,提问作者jeecup D.J
相关产品推荐
相关产品推荐

