Как предоставить полное разрешение на файл, созданный моим приложением, для ВСЕХ пользователей?

Инструмент, который я разрабатываю, должен предоставить права доступа Full Control к созданному им файлу. Его необходимо прочитать, изменить и удалить из всех учетных записей Windows и даже из возможных будущих учетных записей. Могло ли это быть достигнуто?

Я знаю, что могу попробовать это для SPECIFIC_USER:

FileSystemAccessRule rule = new FileSystemAccessRule(SPECIFIC_USER, FileSystemRights.FullControl, AccessControlType.Allow);
FileSecurity fSecurity = File.GetAccessControl(filePath);
fSecurity.SetAccessRule(rule);
File.SetAccessControl(filePath, fSecurity);

Но как мне предоставить его всем пользователям? И даже возможные будущие аккаунты? Если последняя часть невозможна, как выполнить первое требование?

Спасибо.

РЕДАКТИРОВАТЬ:

Это код, который работал для меня. Взято из ссылки ответчика.

private void GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(
        new SecurityIdentifier(WellKnownSidType.WorldSid, null), 
        FileSystemRights.FullControl,
        InheritanceFlags.ObjectInherit |
           InheritanceFlags.ContainerInherit,
        PropagationFlags.NoPropagateInherit,
        AccessControlType.Allow));

    dInfo.SetAccessControl(dSecurity);
}

Обратите внимание на PropagationFlags.NoPropagateInherit, который требуется (упоминается последним в ссылке). Это дает привилегию даже будущим учетным записям.


person nawfal    schedule 02.02.2012    source источник
comment
Примечание для людей: не используйте всех, вместо этого используйте new SecurityIdentifier(WellKnownSidType.WorldSid, null), который возвращает объект SecurityIdentifier. Все работают только с установками Windows на английском языке, использование другого метода обеспечивает совместимость с несколькими языковыми версиями.   -  person Angelo Vargas    schedule 24.04.2013
comment
@trukin можешь ответить? Благодарность   -  person nawfal    schedule 24.04.2013
comment
@nawfal: у меня такая же проблема, и мне нужно предоставить доступ к папке установки после установки приложения, но где я могу написать этот код?   -  person Hina Khuman    schedule 09.01.2018
comment
@HinaKhuman Предоставление прав на папку установки лучше обрабатывается установщиком. Я не знаю, какой из них вы используете, но он должен быть довольно простым. Если вы хотите сделать это из C#, вызовите метод GrantAccess из любого места, где хотите, но само ваше приложение должно иметь права.   -  person nawfal    schedule 09.01.2018
comment
@nawfal: Спасибо! см. подробный вопрос здесь: stackoverflow.com/q/48165315/5743676   -  person Hina Khuman    schedule 09.01.2018


Ответы (2)


Примечание для людей, использующих это.

При использовании буквенных строк для FileSystemAccessRule должно быть WellKnownSidType.WorldSid вместо "everyone".

Причина в том, что существует несколько языков Windows, и все применяются только к EN, поэтому для испанского это может быть «Todos» (или что-то еще).

using System.Security.AccessControl;
using System.Security.Principal;
using System.IO;

private void GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
    dInfo.SetAccessControl(dSecurity);
}
person Angelo Vargas    schedule 25.04.2013
comment
Большое спасибо .. изо всех сил пытался распаковать файлы и установить разрешения для файлов .mdf (потому что я получил ошибки только для чтения). Спасибо! - person CularBytes; 24.01.2015
comment
Могу я спросить цель возвращаемого значения? - person hypehuman; 27.06.2015
comment
@hypehuman, на самом деле, нет, он должен был вызываться откуда-то, и если он не сработает (скажем, GrantAccess перехватит исключение, тогда он вернет false), то любой код, который использует это, не должен продолжаться, поскольку разрешения не были предоставлены. - person Angelo Vargas; 27.06.2015
comment
DirectorySecurity не найден. Что такое эталонная библиотека? Я добавил 3 строки «используя ...», все еще ошибка. - person anhtv13; 25.09.2019
comment
Не забудьте включить InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, иначе он только добавит пользователя/группу без применения к нему каких-либо разрешений (у пользователя/группы будут только специальные разрешения). Просто потратил час, пытаясь понять, почему он применяет какие-либо разрешения к группе, так что надеюсь, что это сэкономит кому-то время! - person demonicdaron; 21.06.2021

Вам нужно будет дать полный контроль группе «Все» на машине. Нашел этот пост на MSDN, в котором говорится о Это.

Надеюсь, что это работает для вас.

person Amar Palsapure    schedule 02.02.2012
comment
Спасибо, я позабочусь об этом. Предоставляет ли это доступ даже к будущим учетным записям? - person nawfal; 02.02.2012
comment
Спасибо, это сработало и предоставило доступ к будущим учетным записям пользователей. Пожалуйста, примите мою правку, чтобы другие знали, что именно нужно сделать. - person nawfal; 02.02.2012