#c#
#c#
Вопрос:
У меня есть код на C #, который создает папку и устанавливает для нее некоторые разрешения. Вот пример кода:
static void Main(string[] args){
Directory.CreateDirectory("C:\vk07");
DirectorySecurity dirSec = Directory.GetAccessControl("C:\vk07");
dirSec.AddAccessRule(new FileSystemAccessRule("INTRANET\fGLBChorusUsers", FileSystemRights.ReadAndExecute, AccessControlType.Allow));
Directory.SetAccessControl("C:\vk07", dirSec);
}
Когда я проверяю разрешения, установленные для созданной выше папки, вместо того, чтобы читать и изменять (что я установил в коде), он показывает только «Специальные разрешения» как отмеченные.
Пожалуйста, кто-нибудь может мне помочь с этим? Я новичок в ACL, поэтому не очень хорошо его понимаю.
Ответ №1:
У меня была такая же проблема, фактическая причина в том, что если вы посмотрите на изображение сетевой службы из другого поста, оно применяется только к файлам. Основные разрешения будут отображаться только на первом изображении, если на них написано «Эта папка, вложенные папки и файлы» Для этого вам нужно установить два флага -InheritanceFlags.ContainerInherit InheritanceFlags.ObjectInherit.
Try
'If destination directory does not exist, create it first.
If Not Directory.Exists(path) Then Directory.CreateDirectory(path)
Dim dir As New DirectoryInfo(path)
Dim dirsec As DirectorySecurity = dir.GetAccessControl()
'Remove inherited permissions
dirsec.SetAccessRuleProtection(True, False)
'create rights, include subfolder and files to be inherited by this
Dim Modify As New FileSystemAccessRule(username, FileSystemRights.Modify, InheritanceFlags.ContainerInherit InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)
Dim Full As New FileSystemAccessRule(admingroup, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)
dirsec.AddAccessRule(Modify)
dirsec.AddAccessRule(Full)
'Set
dir.SetAccessControl(dirsec)
Catch ex As Exception
MsgBox(ex.Message)
End Try
Комментарии:
1. Вопрос был задан для c #?
Ответ №2:
Этот код работает для меня:
security.AddAccessRule(
new FileSystemAccessRule(
"domain\login",
FileSystemRights.Modify,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None,
AccessControlType.Allow
));
Ответ №3:
У меня также была эта проблема. После выполнения следующего кода:
var security = Directory.GetAccessControl(folderPath);
security.AddAccessRule(
new FileSystemAccessRule(
new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null),
FileSystemRights.Modify,
InheritanceFlags.ObjectInherit,
PropagationFlags.InheritOnly,
AccessControlType.Allow
)
);
Directory.SetAccessControl(folderPath, security);
…тогда диалоговое окно свойств для пути к папке будет выглядеть следующим образом:
Как вы упомянули, отмечены только «Специальные разрешения», но если вы нажмете Дополнительно, то увидите:
Обратите внимание, что в этом диалоговом окне СЕТЕВАЯ СЛУЖБА имеет разрешение на изменение.
Кажется, что при программной настройке разрешений Windows не отображает эти разрешения в диалоговом окне «Свойства папки», но они все еще существуют в разделе «Дополнительные параметры безопасности». Я также подтвердил, что моя служба окон (запущенная как СЕТЕВАЯ СЛУЖБА) смогла получить доступ к файлам в пределах пути к папке.
Комментарии:
1. У меня была точно такая же проблема, и я обнаружил, что, следуя предложению Александра В. и используя PropagationFlags. Это не исправлено
Ответ №4:
FileSystemRights.ReadAndExecute
не позволяет изменять. Это доступно только для чтения. Вам потребуется FileSystemRights.Modify
для полного диапазона. Возможно, вы захотите ознакомиться с доступными параметрами.
вот пример из приведенного выше:
String dir = @"C:vk07";
Directory.CreateDirectory(dir);
DirectoryInfo dirInfo = new DirectoryInfo(dir);
DirectorySecurity dirSec = dirInfo.GetAccessControl();
dirSec.AddAccessRule(new FileSystemAccessRule("INTRANET\fGLBChorusUsers",FileSystemRights.Modify,AccessControlType.Allow));
dirInfo.SetAccessControl(dirSec);
Комментарии:
1. Привет, я тоже пытался изменить. Что бы я ни делал, я вижу только «Специальные разрешения», установленные для этой папки. Итак, я думаю, что я здесь чего-то не хватает.
2. Попробуйте следующий код
String dir = @"C:vk07"; Directory.CreateDirectory(dir); DirectoryInfo dirInfo = new DirectoryInfo(dir); DirectorySecurity dirSec = dirInfo.GetAccessControl(); dirSec.AddAccessRule(new FileSystemAccessRule("INTRANET\fGLBChorusUsers",FileSystemRights.Modify,AccessControlType.Allow)); dirInfo.SetAccessControl(dirSec);
3. Хороший пример добавления и удаления можно найти здесь
Ответ №5:
Я получил тот же код для работы в VB, установив FileSystemRights.Полный контроль.
Dim fsRule As FileSystemAccessRule = New FileSystemAccessRule(sid, FileSystemRights.FullControl, (InheritanceFlags.ContainerInherit InheritanceFlags.ObjectInherit), PropagationFlags.None, AccessControlType.Allow)