powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Несколько вопросов по ACL
21 сообщений из 21, страница 1 из 1
Несколько вопросов по ACL
    #38056189
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

Исходные данные:
Windows XP,7,8 Rus/Enu x86/x64
.Net 3.5 SP1

Я программно создаю локальный каталог и копирую в него некоторый серверный каталог, со всем его содержимым. Нужно чтобы любой пользователь этого компьютера имел необходимые права на то, чтобы в случае необходимости заменить этот каталог на его более новую версию. По умолчанию для создаваемого каталога назначаются такие права, что обозначенные мною действия может выполнять только владелец каталога.

В ходе решения (с помощью ACL) этой задачи я столкнулся с рядом трудностей. Далее обо всём по порядку...

1. Локализация...

У моих пользователей Windows XP, 7 Rus, поэтому имя объекта, которому собираюсь давать необходимые разрешения я формировал по правилу:
Код: c#
1.
String account = Path.Combine(Environment.MachineName, "Пользователи");


Однако этот вариант мне очень не нравится, т.к. существует вероятность того, что у некоторых пользователей будет иная локализация, например английская. Я безуспешно пытался вместо "Пользователи" подсунуть "users" и "allusers". Существуют ли варианты имён групп, универсальные для всех локализаций Windows?

2. Возникновение исключения IdentityNotMappedException
Приведённый ниже код генерирует обозначенное исключение
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
String account = Path.Combine(Environment.MachineName, "Пользователи");
//String account = @"HYPROSTROY\Все сотрудники";

FileSystemRights rights = FileSystemRights.FullControl;
AccessControlType controlType = AccessControlType.Allow;
DirectorySecurity security = local_commonDir.Parent.GetAccessControl(AccessControlSections.Access);
FileSystemAccessRule rule = new FileSystemAccessRule(account, rights, controlType);

security.AddAccessRule(rule); // В этой строке получаю исключение IdentityNotMappedException
// local_commonDir - экземпляр DirectoryInfo
local_commonDir.Parent.SetAccessControl(security);


Результат:
Текст ИсключенияSystem.Security.Principal.IdentityNotMappedException перехвачено
Message=Некоторые или ссылки на свойства нельзя преобразовать.


Однако я бы хотел задать разрешения именно для этой группы. Как это правильно сделать в данном случае?

3. В ACL добавляется новая группа, но без указанных для неё разрешений.
Приведённый ниже код добавляет группу, но нужные (т.е. все ) "галочки не выставляет" (см. скрин ниже).
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//String account = Path.Combine(Environment.MachineName, "Пользователи");
String account = @"HYPROSTROY\Все сотрудники";

FileSystemRights rights = FileSystemRights.FullControl; // Все действия
AccessControlType controlType = AccessControlType.Allow; // Разрешить
DirectorySecurity security = local_commonDir.Parent.GetAccessControl(AccessControlSections.Access);
FileSystemAccessRule rule = new FileSystemAccessRule(account, rights, controlType);

security.AddAccessRule(rule);
// local_commonDir - экземпляр DirectoryInfo
local_commonDir.Parent.SetAccessControl(security);



Без выставленных галочек др. пользователи локальной машины не смогут удалить/обновить этот каталог.
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38056202
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum 1. Локализация...

У моих пользователей Windows XP, 7 Rus, поэтому имя объекта, которому собираюсь давать необходимые разрешения я формировал по правилу:
Код: c#
1.
String account = Path.Combine(Environment.MachineName, "Пользователи");



Environment - всякие Variables, Environment.SpecialFolder Enumeration
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38056209
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Environment - всякие Variables, Environment.SpecialFolder Enumeration[/quot]
А это-то здесь при чём? Я ведь не о каталогах спрашиваю, а о группах.
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38056321
Kasper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

Видемо не получены текущие права, в "букваре"
Код: c#
1.
2.
3.
4.
public static DirectorySecurity GetAccessControl(
	string path,
	AccessControlSections includeSections
)
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38056380
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KasperCompositum,

Видемо не получены текущие права, в "букваре"
Код: c#
1.
2.
3.
4.
public static DirectorySecurity GetAccessControl(
	string path,
	AccessControlSections includeSections
)


в .net 3.5 у класса DirectorySecurity статического метода GetAccessControl нет.
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38056440
Kasper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

Directory.GetAccessControl позволяет извлечь записи списка ACL для каталога.
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38056449
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KasperDirectory.GetAccessControl позволяет извлечь записи списка ACL для каталога.
Да, я в курсе и пробовал как альтернативу такой элементарный вариант:
Код: c#
1.
2.
3.
4.
5.
6.
String dir = "C:\test";
DirectorySecurity security = Directory.GetAccessControl(dir);
FileSystemAccessRule rule = new FileSystemAccessRule("Account", FileSystemRights.FullControl, AccessControlType.Allow);
security.AddAccessRule(rule);

Directory.SetAccessControl(dir,security); 


Однако результат всё тот же: "галочки" не устанавливаются.
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38056814
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumArm79Environment - всякие Variables, Environment.SpecialFolder Enumeration
А это-то здесь при чём? Я ведь не о каталогах спрашиваю, а о группах.[/quote]

Сорри, по диагонали прочитал. Увидел слова "локализация" и "пользователь", и не стал дальше читать
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38057089
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Compositum
Код: c#
1.
String account = Path.Combine(Environment.MachineName, "Пользователи");


Чем не нравится

Код: c#
1.
String account = Path.Combine(Environment.MachineName, Environment.UserName);



?
Compositum
Код: c#
1.
FileSystemAccessRule rule = new FileSystemAccessRule(account, rights, controlType);



А пользователь имеет права раздавать права?
=============
Не забуду - гляну на работе, как у меня сделано
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38057095
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Compositum
Код: c#
1.
String account = Path.Combine(Environment.MachineName, "Пользователи");


Чем не нравится
Код: c#
1.
String account = Path.Combine(Environment.MachineName, Environment.UserName);


?
Ты невнимательно читаешь мой код... В коде я назначаю не для текущего пользователя , а для группы "Пользователи" .
Cat2А пользователь имеет права раздавать права?
Полагаю что да, поскольку вручную эти же действия я делаю без проблем, под тем же профилем.
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38057217
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38057490
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ 12641777
Спасибо Даниил! Очень помогли, группа "Все" - это пожалуй лучший вариант в моём случае. Однако проблема с не устанавливающимися галочками осталась. Сейчас код такой:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// The 'local_commonDir' is FileInfo item. I need to change ACL for its Parrent...
String account = new SecurityIdentifier(WellKnownSidType.WorldSid, null)
	.Translate(typeof(NTAccount)).Value;					
FileSystemRights rights = FileSystemRights.FullControl;
AccessControlType controlType = AccessControlType.Allow;
DirectorySecurity security = local_commonDir.Parent.GetAccessControl(
	AccessControlSections.Group | AccessControlSections.Owner);
FileSystemAccessRule rule = new FileSystemAccessRule(account, rights, controlType);
security.AddAccessRule(rule);
local_commonDir.Parent.SetAccessControl(security);


В результате, когда открываю свойства каталога, то вижу, что запись "Все" появилась, но галочки не установлены:



В чём может быть причина такого результата?
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38064391
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumСпасибо Даниил! Очень помогли, группа "Все" - это пожалуй лучший вариант в моём случае. Однако проблема с не устанавливающимися галочками осталась.
Забыл совсем про этот тред. Андрей, проблема актуальна?
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38064399
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУCompositumСпасибо Даниил! Очень помогли, группа "Все" - это пожалуй лучший вариант в моём случае. Однако проблема с не устанавливающимися галочками осталась.
Забыл совсем про этот тред. Андрей, проблема актуальна?
Да, сейчас как раз над этим бьюсь... :(
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38067081
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumДа, сейчас как раз над этим бьюсь... :(
Пришлось повозиться :)

http://codearticles.ru/Home/ArticleView/986
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38067843
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУCompositumДа, сейчас как раз над этим бьюсь... :(
Пришлось повозиться :)

http://codearticles.ru/Home/ArticleView/986
Огромнейшее СПАСИБО!
Даниил, у нас все пользователи имеют перемещаемые профили. Мне нужно, чтобы полные права на каталог имел любой пользователь нашей сети, залогинившийся на машине. Я пытался вместо WellKnownSidType.NetworkServiceSid подставить др. значения, но получал исключения:

// Я пробовал такие варианты:
//
// 1. WellKnownSidType.AccountComputersSid. Исключение: The domainSid parameter must be specified for
// creating well-known SID of type AccountComputersSid. Parameter name: domainSid
//
// 2. WellKnownSidType.AccountDomainUsersSid. Исключение: The domainSid parameter must be specified for
// creating well-known SID of type AccountDomainUsersSid. Parameter name: domainSid

В чём моя ошибка (помимо ДНК :) )?
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38067845
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. где и как я должен указать domainSid? и как получить его корректное значение?
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38067875
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пробовал указывать и так:
Код: c#
1.
var sid = new SecurityIdentifier(WellKnownSidType.AccountDomainUsersSid | WellKnownSidType.BuiltinDomainSid, null);


Но это неправильный вариант, т.к. получаю исключение.
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38067882
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал такой вариант:
Код: c#
1.
var sid = new SecurityIdentifier(WellKnownSidType.AccountDomainUsersSid, new SecurityIdentifier(WellKnownSidType.BuiltinDomainSid, null));


Получал исключение:
ИсключениеThe domainSid parameter is not a valid Windows domain SID.
Parameter name: domainSid
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38067908
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это опять я... :)

Всё, тему можно закрывать. Рабочий вариант для пользователей домена:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WindowsIdentity id = WindowsIdentity.GetCurrent();
var sid = new SecurityIdentifier(WellKnownSidType.AccountDomainUsersSid, id.User.AccountDomainSid);
var security = dir.GetAccessControl();
var rule = new FileSystemAccessRule(sid,
	FileSystemRights.FullControl,
	InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
	PropagationFlags.None,
	AccessControlType.Allow);
security.AddAccessRule(rule);
dir.SetAccessControl(security);
...
Рейтинг: 0 / 0
Несколько вопросов по ACL
    #38067909
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Несколько вопросов по ACL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]