我在 powershell 脚本中运行了一个 ICACLS 命令。该脚本在服务器共享上创建一个新文件夹,在 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:组名:未完成帐户名和安全 ID 之间的映射。+ CategoryInfo:NotSpecified:(组名...y ID 已完成。:String)[],RemoteException + FullyQualifiedErrorID:NativeCommandError
答案1
我编写了脚本来查找错误并采取行动。我将 ICACLS 命令的结果存储在 $Results 中。如果 $Results 是错误,它将显示 Write-Host“暂停 5 秒进行 AD 复制”消息并重试该命令。感谢 @Ryan 的提示。
我试图掩盖“帐户名与安全 ID 之间未进行映射。”使用 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'}
答案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