Собсвенно код:
public class StaticMembers
{
private static FileSystemAccessRule _everyOneAccaunt;
public static FileSystemAccessRule EveryOneAccaunt
{
get
{
if(_everyOneAccaunt == null)
{
string account = new SecurityIdentifier("S-1-1-0").Translate(typeof(NTAccount)).ToString();
_everyOneAccaunt = new FileSystemAccessRule(account, FileSystemRights.FullControl, AccessControlType.Allow);
}
return _everyOneAccaunt;
}
}
public static void SetAllAccessToObject(string path,ILog log)
{
try
{
if (File.Exists(path))
{
FileSecurity fsec = new FileSecurity(path, AccessControlSections.All);
fsec.AddAccessRule(EveryOneAccaunt);
File.SetAccessControl(path, fsec);
return;
}
if (Directory.Exists(path))
{
DirectorySecurity fsec = new DirectorySecurity(path, AccessControlSections.All);
fsec.AddAccessRule(EveryOneAccaunt);
Directory.SetAccessControl(path, fsec);
return;
}
}
catch (Exception ex)
{
log.Error("Ошибка смены прав", ex);
}
}
}
если использовать оное на директорию, то во вкладке безопасность появляется нужный акаунт (Все), только у него нету никаких прав. это фича или баг?
Может переименуете EveryOneAccaunt в EveryOneAccount? а то прямо глаз режет.
void
AllowAccessToEveryone (
string DirectoryPath)
{
//
// Создаём SID, для которого указываем разрешения. В данном
// случае это SID, обозначающий любого пользователя или группу.
//
SecurityIdentifier Sid = new SecurityIdentifier (
WellKnownSidType.WorldSid,
null);
//
// Создаём ACE, разрешающий полный доступ любому пользователю или
// группе. Одновременно указываем, что данные разрешения должны быть
// применены ко всем объектам внутри того объекта, к которому будут
// применены.
//
FileSystemAccessRule FsRule = new FileSystemAccessRule (
Sid,
FileSystemRights.FullControl,
InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,
PropagationFlags.None,
AccessControlType.Allow);
//
// Создаём дескриптор безопасности, содержащий ACL, а также параметры
// наследования разрешений родительского объекта.
//
DirectorySecurity DirSec = new DirectorySecurity ();
//
// Запрещаем наследование каких-либо родительских разрешений, таким
// образом в список разрешений не будут добавлены разрешения назначенные
// каким-либо родительским объектам.
//
DirSec.SetAccessRuleProtection (true, false);
//
// Добавляем созданное ранее разрешение в ACL.
//
DirSec.SetAccessRule (FsRule);
//
// Устанавливаем разрешения для нужной нам папки. При этом будут
// удалены все установленные ранее разрешения и сброшены все флаги
// наследования.
//
Directory.SetAccessControl (DirectoryPath, DirSec);
}