Об этом блоге

Об этом блоге

Добра тебе, читатель.
Это запасной аэродром Великого Позитроника.
А основная писанина — в тележеньке.

вторник, 5 февраля 2013 г.

Из жизни пресмыкающихся

Возникла задача: сделать определённому юзеру больно запрет на удаление определённого каталога (да ещё лежащего в его пользовательском каталоге). Читать-смотреть можно, удалять-изменять - нельзя. Только сделать это надо непременно из командной строки - чтобы была возможность автоматизировать действие (ну а то галочки в свойствах безопасности каждый может проставить).
Казалось бы - icacls делает всё, что надо.
Где-то с этой мыслёй я провозился два часа, не добившись результата. Как только выставляю через icacls запрет на удаление объекта - пропадает возможность просмотра каталога (при этом права те, которые нужны). Выставляю права на просмотр/чтение - появляется возможность удалять (а запрет на удаление в правах всё остаётся по прежнему).
Это не говоря уж о том, что многие ключи в консольной справке icacls выглядят совершенно одинаково, и никаких пояснений этому не даётся. Например:
R - доступ только на чтение
RC - чтение
GR - общее чтение
RD - чтение данных, перечисление содержимого папки

Вот чем они отличаются?

Провожу эксперимент. Выставляю права из свойств каталога, мышкой. Всё, как надо.
Выставляю такие же права из консоли - фигушки. Причём в тех же свойствах все галочки на тех же местах.
Пытаюсь гуглить, но все ссылки с вопросами-ответами ведут на cacls - устаревшую версию утилиты. И на MSDN, конечно, где лежит почти тот же хелп, что встроен в утилиту (ну чуть побольше кажется, на что я сначала внимания не обратил)

Ладно, я же дипломированный сантехник по компьютерам. Должна быть возможность просмотреть ACL, в формате, понимаемом утилитой. Останется поставить разрешения мышкой, посмотреть ACL, а затем его тупо копировать. Тем более, что в MSDN написано - вызвать icacls для объекта без параметров, он и покажет все права.
Пытаюсь - еггог.

Видимо, я уже ждал подсознательно такой подляны, поэтому что сразу полез перепроверять на сервер (W2008R2). На сервере это работает. Также, как и опция /setowner, и ещё несколько опций, которые, по каким-то непонятным причинам, отсутствуют в icacls на Win7Pro.

Ну вот какого хрена, а?

Ладно, делаю, что придумал. Выставляю права, смотрю список прав:

username:(OI)(CI)(DENY)(D,Rc,WDAC,WO)
username:(OI)(CI)(W,RD,REA,X,DC,RA)


(при этом все доступы такие, как и требуются)

Из этого получаю вот такую команду:

icacls "путь к каталогу" /inheritance:d /remove username /grant username:(OI)(CI)(W,RD,REA,X,DC,RA) /deny username:(OI)(CI)(d,Rc,WDAC,WO)

Поясню: опция /inheritance:d нужна для того, чтобы отменить наследование прав от вышестоящего каталога, владельцем которого пользователь является, при этом не стирая их, а копируя. /remove нужно, чтобы удалить прежде выставленные права пользователя (иначе вносимые права просто допишутся к имеющимся).

Вроде оно. Но при попытке обратиться к этому каталогу из под указанного пользователя возникает ошибка отсутствия доступа (хотя все права остаются ровно теми же)!
Иду в свойства, меняю ЛЮБОЕ из них, возвращаю обратно (т.е. не меняется НИЧЕГО) - всё начинает работать.

Вы видите в этом логику? Я нет.
Ковыряю дальше.

Комментариев нет: