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 идентификаторов было сделано.:String) [], RemoteException + FullyQualifiedErrorID: NativeCommandError

2 ответа

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" и повторите команду. Спасибо за совет @ Райан.

Я попытался замаскировать "Не было сопоставления между именами учетных записей и идентификаторами безопасности". красное сообщение об ошибке с конструкцией 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'}
Другие вопросы по тегам