Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Несколько вопросов по ACL / 21 сообщений из 21, страница 1 из 1
28.11.2012, 13:05
    #38056189
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
Доброго времени суток.

Исходные данные:
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
28.11.2012, 13:12
    #38056202
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
Compositum 1. Локализация...

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



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

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

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


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

Directory.GetAccessControl позволяет извлечь записи списка ACL для каталога.
...
Рейтинг: 0 / 0
28.11.2012, 14:59
    #38056449
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
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
28.11.2012, 17:50
    #38056814
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
CompositumArm79Environment - всякие Variables, Environment.SpecialFolder Enumeration
А это-то здесь при чём? Я ведь не о каталогах спрашиваю, а о группах.[/quote]

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


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


?
Ты невнимательно читаешь мой код... В коде я назначаю не для текущего пользователя , а для группы "Пользователи" .
Cat2А пользователь имеет права раздавать права?
Полагаю что да, поскольку вручную эти же действия я делаю без проблем, под тем же профилем.
...
Рейтинг: 0 / 0
29.11.2012, 00:20
    #38057217
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
...
Рейтинг: 0 / 0
29.11.2012, 11:07
    #38057490
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
МСУ 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
04.12.2012, 14:49
    #38064391
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
CompositumСпасибо Даниил! Очень помогли, группа "Все" - это пожалуй лучший вариант в моём случае. Однако проблема с не устанавливающимися галочками осталась.
Забыл совсем про этот тред. Андрей, проблема актуальна?
...
Рейтинг: 0 / 0
04.12.2012, 14:52
    #38064399
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
МСУCompositumСпасибо Даниил! Очень помогли, группа "Все" - это пожалуй лучший вариант в моём случае. Однако проблема с не устанавливающимися галочками осталась.
Забыл совсем про этот тред. Андрей, проблема актуальна?
Да, сейчас как раз над этим бьюсь... :(
...
Рейтинг: 0 / 0
05.12.2012, 23:42
    #38067081
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
CompositumДа, сейчас как раз над этим бьюсь... :(
Пришлось повозиться :)

http://codearticles.ru/Home/ArticleView/986
...
Рейтинг: 0 / 0
06.12.2012, 13:13
    #38067843
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
МСУ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
06.12.2012, 13:15
    #38067845
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
т.е. где и как я должен указать domainSid? и как получить его корректное значение?
...
Рейтинг: 0 / 0
06.12.2012, 13:26
    #38067875
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
Я пробовал указывать и так:
Код: c#
1.
var sid = new SecurityIdentifier(WellKnownSidType.AccountDomainUsersSid | WellKnownSidType.BuiltinDomainSid, null);


Но это неправильный вариант, т.к. получаю исключение.
...
Рейтинг: 0 / 0
06.12.2012, 13:30
    #38067882
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
Пробовал такой вариант:
Код: 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
06.12.2012, 13:40
    #38067908
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
Это опять я... :)

Всё, тему можно закрывать. Рабочий вариант для пользователей домена:
Код: 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
06.12.2012, 13:40
    #38067909
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по ACL
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Несколько вопросов по ACL / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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