Пересчитать унаследованные Windows ACL для жестких ссылок

Как мне заставить Windows пересчитать унаследованные права доступа к файлу?

Инструмент (Mercurial) создал несколько жестких ссылок NTFS на один и тот же файл из разных каталогов. Я могу увидеть их, используя список жестких ссылок fsutil. Это не изменяет ACL файла. Но теперь я хотел бы, чтобы файл наследовал ACL от второй родительской папки. Как я могу это сделать? Как я могу сделать это для всего поддерева?

icacls /inheritance:eпохоже, не помогает...

The Old New Thingсодержит две статьи о унаследованных разрешениях и жестких ссылках:

, но, кажется, не упоминает, как вызвать такой пересчет.

5
задан 29 August 2014 в 17:53
1 ответ

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

Я не специалист по разрешениям NTFS, поэтому, возможно, я что-то упустил. Но по прошествии семи лет частичный ответ, вероятно, лучше, чем никакого ответа. Буду признателен за поправки от эксперта.

Краткий ответ на узкий вопрос «как инициировать такой перерасчет» состоит в том, чтобы использовать опцию/resetдляicacls:

icacls filename /reset

Добавить опцию /t, чтобы получить рекурсию, в которой вы, вероятно, также захотите /qи /c.

Как это взаимодействует с жесткими ссылками? Похоже, что ответ заключается в том, что ACL, примененный к файлу, будет рассчитанным ACL для одного пути к файлу, который вы передали в icacls /reset.

Это означает, что ответ на ваш вопрос «Теперь я хотел бы, чтобы файл наследовал списки управления доступом из второй родительской папки» означает, что это зависит от того, имеете ли вы в виду, что хотите:

  1. чтобы файл наследовал списки управления доступом из второй родительской папки. parent в дополнение к ACL от первого родителя; или
  2. файл наследует ACL от второго родителя вместо ACL от первого родителя.

Второй вариант возможен при использовании 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 обрабатывает пути.

0
ответ дан 13 September 2021 в 13:10

Теги

Похожие вопросы