我完成的脚本会创建一个文件夹和安全组,稍后会使用特殊权限将其添加到相关文件夹中。问题是该脚本在“$ 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
我有基本相同的问题,但使用“AddAccessRule”。
$Acl.AddAccessRule($Ar)
我的脚本因上述错误而失败。就像Patrik Persson提到的那样,在我的情况下,也是因为AD在显示新组时速度很慢,并且在安全组出现在我的AD中之前无法添加Ar。
所以我在我的脚本中添加了一个带有do / until循环的try / catch,我想分享:
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中,我的脚本按预期继续。
您可能希望将用于构建安全组名称的所有字符串扩展为一个干净的变量 - 我发现这可能很敏感。确保$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')
我找到了解决方案并且它失败了,因为ActiveDirectory太慢而无法识别安全组是在将其添加到ACL之前创建的。
我使用的解决方案是在创建组和文件夹后添加10秒的睡眠,现在它按预期工作。