在PowerShell脚本中的ICACLS 50%的工作

我有一个在powershell脚本中运行的ICACLS命令。 该脚本在服务器共享上创build一个新文件夹,在AD中创build一个新的安全组,然后运行ICACLS来调配该文件夹。 当我执行这个函数的时候,有时候它是有效的,有时却不行。 在testing中,只有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:组名称:帐户名称和安全ID之间没有映射完成。 + CategoryInfo:NotSpecified:(Group Name … y IDs done。:String)[],RemoteException + FullyQualifiedErrorID:NativeCommandError

我编写脚本来寻找错误并采取行动。 我将ICACLS命令的结果存储在$ Results中。 如果$ Results是一个错误,它将显示写主机“AD复制暂停5秒”消息并再次尝试该命令。 感谢@Ryan小费。

我试图掩盖“没有帐户名称和安全ID之间的映射已完成”。 带Try / Catch构造的红色错误消息,但没有运气。 我假设Try / Catch不起作用,因为它是一个DOS命令。 不过,只要复制完成,脚本就会继续。 我可以将等待时间增加到10秒,并减less脚本显示的错误消息的数量。 我不希望pipe理员认为是错的,通常红色的错误信息就是这个意思。

 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'} 

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