Назад | Перейти на главную страницу

ICACLS в сценарии powershell работает на 50%

У меня есть команда ICACLS, выполняемая в сценарии PowerShell. Сценарий создает новую папку в общей папке сервера, создает новую группу безопасности в AD, а затем запускает ICACLS для подготовки папки. Когда я выполняю функцию, иногда она работает, а иногда нет. При тестировании только 50% времени команда ICACLS работает успешно.

New-ADGroup -Name "Group Name" -GroupCategory Security -GroupScope Global -SamAccountName "Group Name" -Description "Security Group" -Path "OU=Accounts,DC=Contoso,DC=COM"
New-Item -Path "\\Server1\ServerShare\" -Name "Group Share" -ItemType directory
icacls "\\Server1\ServerShare\Group Share" /Inheritance:r /T /Grant:R "Group Name"

icacls: Имя группы: не было выполнено сопоставление между именами учетных записей и идентификаторами безопасности. + CategoryInfo: NotSpecified: (Имя группы ... y ID было выполнено.: String) [], RemoteException + FullyQualifiedErrorID: NativeCommandError

В ICACLS Использование объясняет, как использовать SID, но это могло быть лучше ... В конце использования показан пример, который НЕ работает. Раздел / GRANT показывает, как ДЕЙСТВИТЕЛЬНО работает. Вам также нужно позаботиться о Powershell в качестве ICACLS аргументы включают звездочки, двоеточия и круглые скобки, которые CMD обрабатывается без проблем, но Powershell обрабатывает иначе, поэтому вам нужно экранировать их обратными кавычками, чтобы передать их в EXE.

$sid = (get-adgroup "group name").sid.value
$sid
S-1-5-21-444444444-5555555555-666666666-77777
icacls "c:\temp\sid" /Inheritance:r /T /Grant:R `*$sid`:`(R`)
processed file: c:\temp\sid
Successfully processed 1 files; Failed processing 0 files

Я закодировал сценарий, чтобы найти ошибку и принять меры. Я сохраняю результаты команды ICACLS в $ Results. Если $ Results является ошибкой, отобразится сообщение Write-Host «Пауза 5 секунд для репликации AD» и повторите попытку. Спасибо за подсказку @Ryan.

Я пытался замаскировать «Сопоставления между именами учетных записей и идентификаторами безопасности не было». красное сообщение об ошибке с конструкцией Try / Catch, но безуспешно. Я предполагаю, что Try / Catch не работает, потому что это команда DOS. Тем не менее, сценарий продолжает работу после завершения репликации. Я мог бы увеличить время ожидания до 10 секунд и уменьшить количество сообщений об ошибках, отображаемых скриптом. Я не хочу, чтобы администратор думал, что что-то не так, и обычно красные сообщения об ошибках означают именно это.

Do
{
     $Results = icacls "\\Server1\ServerShare\Group Share" /Inheritance:r /T /Grant:R "Group Name"
     If ($Results -eq 'Successfully processed 0 files; Failed processing 1 files')
     {
          # We just saw a RED ERROR message.
          Write-Host "Pausing 5 seconds for AD replication"
          Start-Sleep 5
     }
} While ($Results -eq 'Successfully processed 0 files; Failed processing 1 files'}