Как дать полное разрешение на файл, созданный моим приложением для ВСЕХ пользователей?
Инструмент, который я разрабатываю, должен предоставить права доступа "Полный доступ" к созданному им файлу. Это должно быть прочитано, изменено и удалено из всех учетных записей 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 bool 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);
return true;
}
Обратите внимание PropagationFlags.NoPropagateInherit
что требуется (упомянуто ближе к последнему в ссылке). Это дает привилегию даже будущим учетным записям.
3 ответа
Примечание для людей, использующих это.
При использовании буквенных строк для FileSystemAccessRule
, так должно быть WellKnownSidType.WorldSid
вместо "everyone"
,
Причина в том, что существует несколько языков Window, и все применимы только к языкам 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);
}
Вам нужно будет предоставить полный контроль группе "Все" на машине. Нашел этот пост в MSDN, где говорится об этом.
Надеюсь, что это работает для вас.
Вот аналогичный код, но ограниченный только одним файлом, что и привело меня сюда. Хотя для большей безопасности вы можете использовать WellKnownSidType.AuthenticatedUserSid вместо WordSid.
var fileSecurity = new System.Security.AccessControl.FileSecurity();
var everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
var rule = new FileSystemAccessRule(everyone, FileSystemRights.FullControl, AccessControlType.Allow);
fileSecurity.AddAccessRule(rule);
File.SetAccessControl(path, fileSecurity);