我在一台机器上运行C#编写的Windows服务,它创建并使用了许多文件。是否有办法阻止机器上的用户(包括管理员)从代码中弄乱这些文件(移动,编辑,重命名,删除)?
我知道StreamWriter可以实现这一点,但我不想让文件一直打开而不需要实际访问其中的数据,但我似乎无法找到任何其他方式。
编辑:让我根据以下评论重新提问题库。有没有办法以只有我的服务可以访问文件的方式设置ACL?如果只有服务可以访问这些文件,我也会接受(我已经在Microsoft Docs中看到了All Services安全组,但我似乎无法在系统或.net中找到它。)
答案 0 :(得分:2)
你可以改变访问权限但我强烈建议只是让它们保持打开状态(每次批量写入后都要小心刷新流)。
在第一部分中,我尝试直接解决您的问题("如何防止..." ),但在第二部分中,我试图概述一种不同的方法(使你的应用程序具有弹性:保持备份。)
假设您在Windows上运行以避免其他用户弄乱它们,您应该:
设置隐藏属性。默认情况下隐藏隐藏文件,许多用户甚至看不到它们。如果你可以在目录级别进行,那就更好了。
将ACL更改为拒绝 Full access
到Users
和Administrators
组。如果您选择并且只保留Read
权限,那就更好了。默认情况下,Windows选择限制性最强的策略,即使用户属于两个组,这将有效地阻止每个人写入该文件(如果您还拒绝Read
权限,那么他们甚至无法获得看其内容,但稍后见。)
Users
组。Read
权限保留在原位,那么阅读代码就不会受到影响。请勿忘记查看Windows的不同版本和版本(HomeUsers
在我的脑海中保持弹跳。)如果您的应用程序是Windows服务,那么事情可能会稍微简单一些,请参阅{{3} }。
你可以简单地使用Windows资源管理器来试验所有这些事情,只需找到合适的平衡点,但不要忘记每个单独的安装是一个不同的世界,只有上帝知道环境是什么(但他没有'我知道为什么。)
几个明显的缺点:
不要忘记,如果他们真的想破坏您的应用程序,那么他们只会删除应用程序目录......
我想,但我不知道你的具体用例,也许你从错误的角度来解决问题。如果您想阻止用户破坏您的数据文件(有意或无意),那么您需要的是备份。每次写入时都将副本保存在其他位置,将其标记为隐藏并过得开心。如果它们不是太大,您甚至可以直接在 Windows注册表中保存内容。对于加密/散列/校验和文件,您的应用程序可以轻松检测到它们何时被破坏或丢失:只需恢复备份即可完成。
答案 1 :(得分:1)
我不想让文件一直打开
但保持开放是一种紧密遵循你的意图和要求的好方法。
只要它不是数百或更多,这似乎是最好的选择。
另一种方法是设置安全属性(ACL),但这很麻烦,需要更高的权限。
排除管理员不是完全可能的,你不应该真的想要那样。避免意外删除或重命名是可行的,完全控制不是。
答案 2 :(得分:0)
2其他选项
在此处的位置设置一些权限,以便没有人可以访问这些文件
如果您的应用程序将创建所有相关文件,您可以查看CreateFile中的选项,您可以在其中将共享选项设置为0x00000000
以“防止其他进程打开文件或设备,如果他们请求删除,读取或写入访问权限。“
如果你想使用CreateFile
,我猜你必须pinvoke