我完成的脚本创建了一个文件夹和安全组,这些组随后以特殊权限添加到有问题的文件夹中。问题是脚本在“ $ acl.SetAccessRule($ rule_modify)”上失败,并抱怨身份。
错误: “使用“ 1”自变量调用“ SetAccessRule”的异常:“某些或所有身份引用无法转换。”
如果仅通过使用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
答案 0 :(得分:1)
我遇到了基本相同的问题,但是使用了“ 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中,并且我的脚本按预期继续。
答案 1 :(得分:0)
您可能想将用于将安全组名称构建为一个干净变量的所有字符串扩展-我发现这可能很敏感。构造后,请确保$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')
答案 2 :(得分:0)
我找到了解决方案,但它失败了,因为ActiveDirectory太慢了,无法在将安全组添加到ACL之前就认识到该安全组已正确创建。
我要解决的方法是在创建组和文件夹后添加10秒钟的睡眠,现在它可以按预期工作了。
答案 3 :(得分:0)
在远程文件服务器上创建共享时遇到了类似的问题。
起初,我使用了建议的解决方案 (start-sleep),但它不够好,因为它在处理大量共享时显着增加了消耗的时间。
事实证明,您可以在定义 ACE 时使用 SID,并且操作是即时的:
$TempSID = (Get-ADGroup "FIL_$($Department)_$($Group)_Modify").SID
$PermissionModify = "Write, Read, ListDirectory, ReadAndexecute, DeleteSubdirectoriesAndFiles"
$Inherit = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit"
$Propagation = [system.security.accesscontrol.PropagationFlags]"None"
$Type = "Allow"
$modifyRule = New-Object System.Security.AccessControl.FileSystemAccessRule($TempSID, $PermissionModify, $Inherit, $Propagation, $Type)
似乎 Active Directory 需要一些时间(在我的情况下为 2 秒)将 SID 转换为组名称(以 DOMAIN\groupName 格式)。