Возникла задача: сделать определённому юзеру больно запрет на удаление определённого каталога (да ещё лежащего в его пользовательском каталоге). Читать-смотреть можно, удалять-изменять - нельзя. Только сделать это надо непременно из командной строки - чтобы была возможность автоматизировать действие (ну а то галочки в свойствах безопасности каждый может проставить).
Казалось бы - 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 нужно, чтобы удалить прежде выставленные права пользователя (иначе вносимые права просто допишутся к имеющимся).
Вроде оно. Но при попытке обратиться к этому каталогу из под указанного пользователя возникает ошибка отсутствия доступа (хотя все права остаются ровно теми же)!
Иду в свойства, меняю ЛЮБОЕ из них, возвращаю обратно (т.е. не меняется НИЧЕГО) - всё начинает работать.
Вы видите в этом логику? Я нет.
Ковыряю дальше.
Казалось бы - 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 нужно, чтобы удалить прежде выставленные права пользователя (иначе вносимые права просто допишутся к имеющимся).
Вроде оно. Но при попытке обратиться к этому каталогу из под указанного пользователя возникает ошибка отсутствия доступа (хотя все права остаются ровно теми же)!
Иду в свойства, меняю ЛЮБОЕ из них, возвращаю обратно (т.е. не меняется НИЧЕГО) - всё начинает работать.
Вы видите в этом логику? Я нет.
Ковыряю дальше.
Комментариев нет:
Отправить комментарий