PowerShell SetAccessRule для сбоя ACL - PullRequest
0 голосов
/ 25 марта 2019

Сценарий, который я создал, создает папку и группы безопасности, которые впоследствии добавляются в соответствующую папку со специальными разрешениями. Проблема заключается в том, что скрипт завершается с ошибкой «$ acl.SetAccessRule ($ rule_modify)» и жалуется на идентификационные данные.

Ошибка: «Исключение вызывает« SetAccessRule »с аргументом (ами)« 1 »:« Некоторые или все ссылки на идентификаторы не могут быть переведены. »

Если я запускаю сценарий построчно, просто используя копирование / вставку из ISE в обычное окно PowerShell, все проходит без ошибок, используя то же местоположение и пользователя.

Это важный бит, который не работает.

#Get ACL list
$acl = Get-Acl -Path $Path 
$acl.SetAccessRuleProtection($false,$false)

#Add permission for modify
$set_modify = "INTRA\FIL_$($Department)_$($Group)_Modify", 'DeleteSubdirectoriesAndFiles, Write, ReadAndExecute, Synchronize', 'ContainerInherit, ObjectInherit', 'None', 'Allow'
$rule_modify = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $set_modify
$acl.SetAccessRule($rule_modify)
$acl | Set-Acl $path

Ответы [ 3 ]

1 голос
/ 18 июня 2019

У меня была в основном та же проблема, но с "AddAccessRule".

$Acl.AddAccessRule($Ar)

Мой сценарий завершился ошибкой с вышеупомянутой ошибкой.Как упоминал Патрик Перссон, в моем случае это было также из-за того, что AD медленно отображал новые группы, и Ar не мог быть добавлен, пока группа безопасности не появилась в моей AD.

Так что я добавил try / catchс циклом do / till для моего скрипта, которым я хочу поделиться:

do {
  $check = 'ok'
  try {
    $Acl.AddAccessRule($Ar)
  } catch [System.Management.Automation.RuntimeException] {
    $_.Exception.Message
    $check = 'error'
    Start-Sleep -Seconds 2
  }
} until (
  $check -eq 'ok'
)

Таким образом, цикл продолжается до тех пор, пока AD правильно не зарегистрирует группу безопасности.После этого Ar добавляется в acl, и мой сценарий продолжается, как и ожидалось.

0 голосов
/ 26 марта 2019

Я нашел решение, и оно не работает, потому что ActiveDirectory слишком медленно распознает, что группа безопасности правильно создана перед добавлением ее в ACL.

Я решил добавить 10-секундный сон послеГруппы и папка были созданы, и теперь они работают как задумано.

0 голосов
/ 26 марта 2019

Возможно, вы захотите развернуть все строки, которые вы используете для создания имени вашей группы безопасности, в чистую переменную - я считаю, что это может быть обидно. Убедитесь, что $secgroup содержит правильное строковое значение, когда вы его создали.

Вы можете также создать правило вместе с типом объекта в одной строке.

$secgroup = "INTRA\FIL_$($Department)_$($Group)_Modify"
$modifyRule = New-Object System.Security.AccessControl.FileSystemAccessRule($secgroup,'DeleteSubdirectoriesAndFiles, Write, ReadAndExecute, Synchronize','ContainerInherit, ObjectInherit','None','Allow')

Кстати, если, по сути, вы хотите, чтобы ваши пользователи имели права на изменение содержимого без возможности удаления родительской папки, это должно сработать, если вы установите флаг InheritOnly (я его не проверял).

$modifyRule = New-Object System.Security.AccessControl.FileSystemAccessRule($secgroup,'Modify, Synchronize', 'ContainerInherit, ObjectInherit','InheritOnly','Allow')
...