none
Get-Acl / Set-Acl множества папок RRS feed

  • Вопрос

  • Подскажите пожалуйста.

    Имеется одна папка (назовем "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])
    }


    Слава России!

    • Предложено в качестве ответа sifaa 27 июня 2019 г. 20:14
    • Отменено предложение в качестве ответа sifaa 27 июня 2019 г. 20:48
    • Предложено в качестве ответа sifaa 27 июня 2019 г. 20:49
    • Помечено в качестве ответа Ivanka85 27 июня 2019 г. 20:50
    27 июня 2019 г. 20:03
  • for ($I = 0; $I -lt $source_list.Count; $I++) {
     Get-Acl $source_list[$I] | Set-Acl $client_list[$I]
    }


    • Предложено в качестве ответа sifaa 27 июня 2019 г. 20:49
    • Помечено в качестве ответа Ivanka85 27 июня 2019 г. 20:50
    27 июня 2019 г. 20:49

Все ответы

  • Проблема в том, что Powershell не знает, как сопоставить исходную и целевую папку, когда вы передаете ему списки этих папок: он не может угадать, что нужно в цикле взять очередную папку из списка исходных и сопоставить ей папку с тем же номером из списка целевых.

    Этот цикл придётся написать самому (вместо последней строчки).

    Примерно так (код я не проверял, так что возможны ошибки)

    for ($I = 0; $I -lt $source_list.Count; ++$I) {
     Get-Acl ($source_list[$I]) | Set-Acl (client_list[$I])
    }


    Слава России!

    • Предложено в качестве ответа sifaa 27 июня 2019 г. 20:14
    • Отменено предложение в качестве ответа sifaa 27 июня 2019 г. 20:48
    • Предложено в качестве ответа sifaa 27 июня 2019 г. 20:49
    • Помечено в качестве ответа Ivanka85 27 июня 2019 г. 20:50
    27 июня 2019 г. 20:03
  • for ($I = 0; $I -lt $source_list.Count; $I++) {
     Get-Acl $source_list[$I] | Set-Acl $client_list[$I]
    }


    • Предложено в качестве ответа sifaa 27 июня 2019 г. 20:49
    • Помечено в качестве ответа Ivanka85 27 июня 2019 г. 20:50
    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