Как мне заставить Windows пересчитать унаследованные права доступа к файлу?
Инструмент (Mercurial) создал несколько жестких ссылок NTFS на один и тот же файл из разных каталогов.
Я могу увидеть их, используя список жестких ссылок fsutil
. Это не изменяет ACL файла.
Но теперь я хотел бы, чтобы файл наследовал ACL от второй родительской папки.
Как я могу это сделать? Как я могу сделать это для всего поддерева?
icacls /inheritance:e
похоже, не помогает...
The Old New Thingсодержит две статьи о унаследованных разрешениях и жестких ссылках:
, но, кажется, не упоминает, как вызвать такой пересчет.
Я столкнулся с этим вопросом, когда искал, как инициировать перерасчет разрешений, поэтому отчасти я хотел оставить ответ, чтобы следующий человек мог узнать, как инициировать перерасчет, но вопрос о том, как взаимодействуют ACL и жесткие ссылки, меня заинтриговал, поэтому Я провел несколько экспериментов.
Я не специалист по разрешениям NTFS, поэтому, возможно, я что-то упустил. Но по прошествии семи лет частичный ответ, вероятно, лучше, чем никакого ответа. Буду признателен за поправки от эксперта.
Краткий ответ на узкий вопрос «как инициировать такой перерасчет» состоит в том, чтобы использовать опцию/reset
дляicacls
:
icacls filename /reset
Добавить опцию /t
, чтобы получить рекурсию, в которой вы, вероятно, также захотите /q
и /c
.
Как это взаимодействует с жесткими ссылками? Похоже, что ответ заключается в том, что ACL, примененный к файлу, будет рассчитанным ACL для одного пути к файлу, который вы передали в icacls /reset
.
Это означает, что ответ на ваш вопрос «Теперь я хотел бы, чтобы файл наследовал списки управления доступом из второй родительской папки» означает, что это зависит от того, имеете ли вы в виду, что хотите:
Второй вариант возможен при использовании icacls /reset
с путем от второго родителя (, возможно, с/t
). Первый вариант не представляется легко возможным.
Вот мои эксперименты. В каждом случае я дам команды, а затем небольшую диаграмму.
Сначала я создал две папки с разными наследуемыми разрешениями:
C:\Users\User0\AppData\Local\Temp>md icacls_test
C:\Users\User0\AppData\Local\Temp>cd icacls_test
C:\Users\User0\AppData\Local\Temp\icacls_test>md foo
C:\Users\User0\AppData\Local\Temp\icacls_test>md bar
C:\Users\User0\AppData\Local\Temp\icacls_test>icacls foo /grant User1:(oi)(ci)(rx)
processed file: foo
Successfully processed 1 files; Failed processing 0 files
C:\Users\User0\AppData\Local\Temp\icacls_test>icacls bar /grant User2:(oi)(ci)(rx)
processed file: bar
Successfully processed 1 files; Failed processing 0 files
c:\
|
Users
|
User0
+user0:(oi)(ci)(f)
:
:
icacls_test
/ \
foo bar
+user1:(oi)(ci)(rx) +user2:(oi)(ci)(rx)
Затем я создал файл в одном из двух каталогов, и, как и ожидалось, он унаследовал разрешения от своего родителя:
C:\Users\User0\AppData\Local\Temp\icacls_test>cd foo
C:\Users\User0\AppData\Local\Temp\icacls_test\foo>copy con: baz.txt
Baz
^Z
1 file(s) copied.
C:\Users\User0\AppData\Local\Temp\icacls_test\foo>icacls baz.txt
baz.txt ThisMachine\User1:(I)(RX)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
ThisMachine\User0:(I)(F)
Successfully processed 1 files; Failed processing 0 files
c:\
|
Users
|
User0
+user0:(oi)(ci)(f)
:
:
icacls_test
/ \
foo bar
+user1:(oi)(ci)(rx) +user2:(oi)(ci)(rx)
|
baz.txt
user0:(f) user1(rx)
Затем я создал жесткую ссылку из второго каталог в этот файл. Как сообщил человек, задавший вопрос, права доступа к файлу не изменены.Файл сохраняет разрешения, унаследованные от первого каталога при его создании.
C:\Users\User0\AppData\Local\Temp\icacls_test\foo>cd..
C:\Users\User0\AppData\Local\Temp\icacls_test>cd bar
C:\Users\User0\AppData\Local\Temp\icacls_test\bar>fsutil hardlink create link.txt c:\Users\User0\AppData\Local\Temp\icacls_test\foo\baz.txt
Hardlink created for C:\Users\User0\AppData\Local\Temp\icacls_test\bar\link.txt <<===>> c:\Users\User0\AppData\Local\Temp\icacls_test\foo\baz.txt
C:\Users\User0\AppData\Local\Temp\icacls_test\bar>icacls link.txt
link.txt ThisMachine\User1:(I)(RX)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
ThisMachine\User0:(I)(F)
Successfully processed 1 files; Failed processing 0 files
c:\
|
Users
|
User0
+user0:(oi)(ci)(f)
:
:
icacls_test
/ \
foo bar
+user1:(oi)(ci)(rx) +user2:(oi)(ci)(rx)
| |
baz.txt link.txt
\ /
\ /
\ /
user0:(f) user1:(rx)
Если я теперь применяю icacls /reset
с использованием нового пути к файлу, ACL пересчитывается с использованием разрешений, унаследованных по этому пути (, то есть из второго каталога), и они перезаписывают текущий ACL. Это означает, что разрешения, унаследованные от первого каталога, теряются:
C:\Users\User0\AppData\Local\Temp\icacls_test\bar>icacls link.txt /reset
processed file: link.txt
Successfully processed 1 files; Failed processing 0 files
C:\Users\User0\AppData\Local\Temp\icacls_test\bar>cd..
C:\Users\User0\AppData\Local\Temp\icacls_test>icacls *.txt /t
bar\link.txt ThisMachine\User2:(I)(RX)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
ThisMachine\User0:(I)(F)
foo\baz.txt ThisMachine\User2:(I)(RX)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
ThisMachine\User0:(I)(F)
Successfully processed 2 files; Failed processing 0 files
c:\
|
Users
|
User0
+user0:(oi)(ci)(f)
:
:
icacls_test
/ \
foo bar
+user1:(oi)(ci)(rx) +user2:(oi)(ci)(rx)
| |
baz.txt link.txt
\ /
\ /
\ /
user0:(f) user2:(rx)
Как и следовало ожидать, применение icacls /reset
к первому пути имеет противоположный эффект:разрешения, унаследованные от первого каталога, восстанавливаются, а унаследованные от второго каталога потеряны.
C:\Users\User0\AppData\Local\Temp\icacls_test>icacls foo\baz.txt /reset
processed file: foo\baz.txt
Successfully processed 1 files; Failed processing 0 files
C:\Users\User0\AppData\Local\Temp\icacls_test>icacls *.txt /t
bar\link.txt ThisMachine\User1:(I)(RX)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
ThisMachine\User0:(I)(F)
foo\baz.txt ThisMachine\User1:(I)(RX)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
ThisMachine\User0:(I)(F)
Successfully processed 2 files; Failed processing 0 files
c:\
|
Users
|
User0
+user0:(oi)(ci)(f)
:
:
icacls_test
/ \
foo bar
+user1:(oi)(ci)(rx) +user2:(oi)(ci)(rx)
| |
baz.txt link.txt
\ /
\ /
\ /
user0:(f) user1:(rx)
Если я попытаюсь выполнить одну команду icacls для обоих файлов, например icacls *.txt /t /reset
, она все равно не сработает. Я получаю один из двух наборов разрешений (либо user1, либо user2, но не оба ). Какой из них зависит от порядка, в котором icacls обрабатывает пути.