C# .Net FileSystemRights 拒绝删除权限并稍后添加

C# .Net FileSystemRights Deny Deletion permission and add later on

我的程序生成一个文件。这个文件应该受到保护,这样用户就不会不小心删除它。 所以,它需要以某种方式加以保护。

由于文件应该受到保护,而应用程序 已关闭 FileStream.Lock 不是适合此任务的解决方案。

我试图拒绝 FileSystemRights.Delete 文件,例如:

    fSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                FileSystemRights.Delete, AccessControlType.Deny));

但这并不能阻止删除,为此我必须这样更改它:

    fSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                FileSystemRights.Delete | FileSystemRights.WriteAttributes, AccessControlType.Deny));

(用户可以打开文件属性并添加回 WriteAttribute 权限,然后可以删除文件,这很好)

现在的问题是:该文件应该可以从应用程序中删除。但在做:

    fSecurity.RemoveAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                FileSystemRights.Delete | FileSystemRights.WriteAttributes, AccessControlType.Deny));
    // or:
    fSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                FileSystemRights.Delete | FileSystemRights.WriteAttributes, AccessControlType.Allow));

导致 UnauthorizedAccessException。所以我无法撤消我所做的事情。 这很奇怪,因为在文件资源管理器中绝对可以这样做。


所以我的问题是 - 你如何再次授予删除权限 - 或者:保护文件不被意外删除的最佳方法是什么



该文件已经在 %appdata% 中,但由于用户 可能 删除了其他文件夹,因此绝对不能意外删除该文件

@canton7 谢谢!这非常有帮助

好的,经过反复试验,我得到了解决方案:

  1. 您必须将文件设置为只读。拒绝删除本身不起作用
  2. 您必须拒绝删除 + WriteAttributes - 如果您不这样做,则可以在文件资源管理器中删除文件而无需请求权限。

  3. 再次解锁文件时:加回权限

    • 您必须删除您添加的拒绝规则
    • 并且您必须添加标志以允许
    • 只做其中一项是行不通的
  4. 删除只读标志
        private static void LockFile(string _FullPath)
        {
            File.SetAttributes(_FullPath, File.GetAttributes(_FullPath) | FileAttributes.ReadOnly);

            FileSecurity fSecurity = File.GetAccessControl(_FullPath);

            fSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                FileSystemRights.Delete | FileSystemRights.WriteAttributes, AccessControlType.Deny));

            File.SetAccessControl(_FullPath, fSecurity);
        }

        private static void UnLockFile(string _FullPath)
        {
            FileSecurity fSecurity = File.GetAccessControl(_FullPath);

            fSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                FileSystemRights.Delete | FileSystemRights.WriteAttributes, AccessControlType.Allow));

            fSecurity.RemoveAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                FileSystemRights.Delete | FileSystemRights.WriteAttributes, AccessControlType.Deny));

            File.SetAccessControl(_FullPath, fSecurity);

            File.SetAttributes(_FullPath, FileAttributes.Normal);
        }