Лучший отвечающий
Get-Acl / Set-Acl множества папок

Вопрос
-
Подскажите пожалуйста.
Имеется одна папка (назовем "X"), внутри которой своя иерархия папок с подпапками и определенными правами.
В корне "X" выданы соответствующие права безопасности и выключено наследование. Далее в каких то папках оно то включено и добавлены дополнительные явные разрешения, то выключено, это касается всей сложной структуры.
Нужно создать вторую папку (назовем "Y"), внутри всегда создаются подпапки c точно такой же иерархии как и "X" и с точно такими же правами. Подпапки создаются разными людьми, либо robocopy, это не важно. Я отношусь к владельцам всех этих папок. Вот что имею:
$client = "!test1"
#Тут не обращайте внимание. МестА, где создаются и потом переносятся папки и "шаблонная папка" это три разных места, проблема только с правами
ROBOCOPY "\\PC\!НОВЫЕ КЛИЕНТЫ\$client" "\\PC\new\$client" *.* /V /S /E /R:100 /W:1
$source = "\\PC\!!Шаблонная_папка\"
$path = '\\PC\new\' + $client + '\'
$source_list = Get-ChildItem $source -Attributes Directory -Depth 10 | foreach { $_.FullName + '\' }#| Sort-Object Length не помогает
$client_list = Get-ChildItem $path -Attributes Directory -Depth 10 | foreach { $_.FullName + '\' }#| Sort-Object Length не помогает
# это работает, успешно применяет права
Get-Acl $source | Set-Acl $path
# тут где-то проблема, честно говоря пару раз как мне показалось удалось получить желаемый результат, но не всегда, обычно применяются права с унаследованием, но не выдаются явные права
Get-Acl $source_list | Set-Acl $client_listВ чем ошибка не подскажите?
Вот для наглядности
$client = "!test1" ROBOCOPY "\\PC\!НОВЫЕ КЛИЕНТЫ\$client" "\\PC\new\$client" *.* /V /S /E /R:100 /W:1 $source = "\\PC\!!Шаблонная_папка\" $path = '\\PC\new\' + $client + '\' $source_list = Get-ChildItem $source -Attributes Directory -Depth 10 | foreach { $_.FullName + '\' } $client_list = Get-ChildItem $path -Attributes Directory -Depth 10 | foreach { $_.FullName + '\' } Get-Acl $source | Set-Acl $path Get-Acl $source_list | Set-Acl $client_list
Если проделать все строчки кроме последней, потом посмотрев результаты $source_list и $client_list и рандомно выбрать одну папку выполнить на пример
Get-Acl "\\PC\!!Шаблонная_папка\clientt\" | Set-Acl \\PC\new\clientt\"
То все успешно выполняется. И права и наследование успешно передается.
27 июня 2019 г. 17:08
Ответы
-
Проблема в том, что Powershell не знает, как сопоставить исходную и целевую папку, когда вы передаете ему списки этих папок: он не может угадать, что нужно в цикле взять очередную папку из списка исходных и сопоставить ей папку с тем же номером из списка целевых.
Этот цикл придётся написать самому (вместо последней строчки).
Примерно так (код я не проверял, так что возможны ошибки)
for ($I = 0; $I -lt $source_list.Count; ++$I) { Get-Acl ($source_list[$I]) | Set-Acl (client_list[$I]) }
Слава России!
27 июня 2019 г. 20:03 -
for ($I = 0; $I -lt $source_list.Count; $I++) { Get-Acl $source_list[$I] | Set-Acl $client_list[$I] }
27 июня 2019 г. 20:49
Все ответы
-
Проблема в том, что Powershell не знает, как сопоставить исходную и целевую папку, когда вы передаете ему списки этих папок: он не может угадать, что нужно в цикле взять очередную папку из списка исходных и сопоставить ей папку с тем же номером из списка целевых.
Этот цикл придётся написать самому (вместо последней строчки).
Примерно так (код я не проверял, так что возможны ошибки)
for ($I = 0; $I -lt $source_list.Count; ++$I) { Get-Acl ($source_list[$I]) | Set-Acl (client_list[$I]) }
Слава России!
27 июня 2019 г. 20:03 -
for ($I = 0; $I -lt $source_list.Count; $I++) { Get-Acl $source_list[$I] | Set-Acl $client_list[$I] }
27 июня 2019 г. 20:49 -
Проблема в том, что Powershell не знает, как сопоставить исходную и целевую папку, когда вы передаете ему списки этих папок: он не может угадать, что нужно в цикле взять очередную папку из списка исходных и сопоставить ей папку с тем же номером из списка целевых.
Этот цикл придётся написать самому (вместо последней строчки).
Примерно так (код я не проверял, так что возможны ошибки)
for ($I = 0; $I -lt $source_list.Count; ++$I) { Get-Acl ($source_list[$I]) | Set-Acl (client_list[$I]) }
Слава России!
27 июня 2019 г. 20:51