C # .Net FileSystemRights Запретить разрешение на удаление и добавить позже - PullRequest
0 голосов
/ 10 октября 2019

Моя программа генерирует файл. этот файл должен быть защищен, чтобы пользователь не мог случайно удалить его. Таким образом, его необходимо каким-то образом защитить.

Поскольку файл должен быть защищен, а приложение закрыто 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%, но, поскольку существуют другие папки, которые пользователь может удалить, онабсолютно обязательно, чтобы этот файл не был удален случайно

1 Ответ

0 голосов
/ 10 октября 2019

@ canton7 спасибо! это было чрезвычайно полезно

хорошо, с большим количеством проб и ошибок, я получил решение:

  1. Вы должны установить файл только для чтения. Отказ от удаления сам по себе не работает
  2. Вы должны запретить удаление + WriteAttributes - если вы этого не сделаете, файл можно удалить в проводнике без запроса привилегий.

  3. При повторной разблокировке файла: сначала добавьте привилегии

    • . Вы должны удалить добавленные вами правила запрета
    • добавить флаги, чтобы разрешить
    • делать только одно из этого, не работает
  4. убрать флаг readonly
        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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...