You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 双重保障:锁定+权限加固

最好的方式是同时使用上面两种方案:

  1. 先运行权限加固代码,给文件设置不可篡改的权限
  2. 再启动文件独占锁定,保持流打开

这样即使有人拿到管理员权限修改了权限,只要你的程序还在运行,文件流处于锁定状态,他们还是没法修改文件。

一些注意事项

  • 独占锁定的文件流必须一直保持打开,不能中途关闭,否则锁定失效
  • 如果你的程序需要多进程共享文件,独占锁定不适用,可以用FileStream.Lock()锁定特定字节范围,但这种方式没法完全防止修改
  • 权限加固需要管理员权限,所以你的程序可能需要设置UAC清单,默认以管理员身份运行

内容的提问来源于stack exchange,提问作者jeecup D.J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:27:52