阻止其他进程和用户访问文件

时间:2018-05-04 06:36:50

标签: c# .net windows

我在一台机器上运行C#编写的Windows服务,它创建并使用了许多文件。是否有办法阻止机器上的用户(包括管理员)从代码中弄乱这些文件(移动,编辑,重命名,删除)?

我知道StreamWriter可以实现这一点,但我不想让文件一直打开而不需要实际访问其中的数据,但我似乎无法找到任何其他方式。

编辑:让我根据以下评论重新提问题库。有没有办法以只有我的服务可以访问文件的方式设置ACL?如果只有服务可以访问这些文件,我也会接受(我已经在Microsoft Docs中看到了All Services安全组,但我似乎无法在系统或.net中找到它。)

3 个答案:

答案 0 :(得分:2)

你可以改变访问权限但我强烈建议只是让它们保持打开状态(每次批量写入后都要小心刷新流)。

在第一部分中,我尝试直接解决您的问题("如何防止..." ),但在第二部分中,我试图概述一种不同的方法(使你的应用程序具有弹性:保持备份。)

如何预防...

假设您在Windows上运行以避免其他用户弄乱它们,您应该:

  • 设置隐藏属性。默认情况下隐藏隐藏文件,许多用户甚至看不到它们。如果你可以在目录级别进行,那就更好了。

  • 将ACL更改为拒绝 Full accessUsersAdministrators组。如果您选择并且只保留Read权限,那就更好了。默认情况下,Windows选择限制性最强的策略,即使用户属于两个组,这将有效地阻止每个人写入该文件(如果您还拒绝Read权限,那么他们甚至无法获得看其内容,但稍后见。)

  • 使用一个用户创建一个特殊组(具有所需权限,仅限那些权限)。请确保该用户未自动添加到Users组。
  • 更改您的应用程序以在编写这些文件时模拟该用户。如果您将Read权限保留在原位,那么阅读代码就不会受到影响。

请勿忘记查看Windows的不同版本和版本(HomeUsers在我的脑海中保持弹跳。)如果您的应用程序是Windows服务,那么事情可能会稍微简单一些,请参阅{{3} }。

你可以简单地使用Windows资源管理器来试验所有这些事情,只需找到合适的平衡点,但不要忘记每个单独的安装是一个不同的世界,只有上帝知道环境是什么(但他没有'我知道为什么。)

几个明显的缺点:

  • 管理员可以随时执行他想要的操作,然后他们可以找到这些文件并还原权限。我认为(我不确定)System Installer有一些特殊权限可以防止这种情况,但我不确定(我无法想象如何做到这一点)。
  • 安装更加复杂(如果你没有,你将需要一个)。您可以在第一次执行应用程序时执行此操作,但之后您将需要管理权限(只需一次但可能更糟。)
  • 您的代码更复杂。
  • 更多设置意味着可能出现更多问题,并与技术支持团队的努力保持平衡。
  • 更新(和技术支持工作)将更加复杂。
  • 具有特定权限的用户不会受到影响(请参阅eryksun's comment),但这确实是一件好事,您不应该每次都试图绕过它。

备份是关键!

不要忘记,如果他们真的想破坏您的应用程序,那么他们只会删除应用程序目录......

我想,但我不知道你的具体用例,也许你从错误的角度来解决问题。如果您想阻止用户破坏您的数据文件(有意或无意),那么您需要的是备份。每次写入时都将副本保存在其他位置,将其标记为隐藏并过得开心。如果它们不是太大,您甚至可以直接在 Windows注册表中保存内容。对于加密/散列/校验和文件,您的应用程序可以轻松检测到它们何时被破坏或丢失:只需恢复备份即可完成。

答案 1 :(得分:1)

  

我不想让文件一直打开

但保持开放是一种紧密遵循你的意图和要求的好方法。

只要它不是数百或更多,这似乎是最好的选择。

另一种方法是设置安全属性(ACL),但这很麻烦,需要更高的权限。

排除管理员不是完全可能的,你不应该真的想要那样。避免意外删除或重命名是可行的,完全控制不是。

答案 2 :(得分:0)

2其他选项

  • 在此处的位置设置一些权限,以便没有人可以访问这些文件

  • 如果您的应用程序将创建所有相关文件,您可以查看CreateFile中的选项,您可以在其中将共享选项设置为0x00000000以“防止其他进程打开文件或设备,如果他们请求删除,读取或写入访问权限。“

如果你想使用CreateFile,我猜你必须pinvoke

相关问题