Set-Acl运行触发未授权访问异常,操作用户为目标文件夹所有者
问题排查与修复方案
- 第一个坑:共享权限校验不到位
你只校验了NTFS权限,需要再检查\\srv\Projekty的共享级权限,确保domain\project_creation用户在共享权限中被授予了完全控制或修改权限,Windows中共享权限和NTFS权限是取交集生效,只要有一端权限不足就会触发未授权错误。 - 第二个坑:路径解析错误
你代码中使用了相对路径和变量拼接的方式构造路径,在UNC共享路径下PowerShell的工作目录解析极易出现偏差:Get-ChildItem返回的是DirectoryInfo/FileInfo对象,直接拼接$root\PROJEKT TEMPLATE\$folder不会按照预期拼接为完整路径Set-Acl时使用相对路径$folder,在网络共享场景下经常出现路径识别错误
- 第三个坑:ACL对象包含SACL导致写入失败
Get-Acl默认会读取目标对象的SACL(系统访问控制列表,用于审计),如果你的模板文件夹的SACL配置限制了当前用户读取,哪怕你有DACL修改权限,也会导致Set-Acl写入时触发未授权错误。 - 第四个坑:ACL设置顺序错误
你当前代码先修改子文件夹权限,再修改父文件夹权限,父文件夹的权限继承规则会覆盖你刚刚设置的子文件夹权限,不仅做了无用功,还可能触发继承规则导致的写入冲突。 - 第五个坑:未过滤子对象类型
Get-ChildItem默认会同时返回文件和文件夹,如果模板根目录下存在文件,你拼接的模板路径会指向不存在的文件夹,直接触发报错。
修复后的代码片段
try{ # 先关闭新文件夹的权限继承,避免上层权限干扰 $newFolderAcl = Get-Acl -Path $project_folder_full_location # 第一个参数$true=禁用继承,第二个参数$false=删除继承来的权限,需要保留继承权限可改为$true $newFolderAcl.SetAccessRuleProtection($true, $false) Set-Acl -Path $project_folder_full_location -AclObject $newFolderAcl # 先设置父文件夹的模板ACL $templateRootAcl = Get-Acl -Path "$root\PROJEKT TEMPLATE" # 只保留DACL,过滤SACL避免权限问题 $templateRootAcl.SetSecurityDescriptorSddlForm($templateRootAcl.Sddl.Split('S:')[0]) Set-Acl -Path $project_folder_full_location -AclObject $templateRootAcl # 遍历模板的子文件夹,全部用绝对路径操作,只取文件夹 foreach($templateSubFolder in Get-ChildItem -Path "$root\PROJEKT TEMPLATE" -Directory){ $targetSubFolderPath = Join-Path -Path $project_folder_full_location -ChildPath $templateSubFolder.Name $subAcl = Get-Acl -Path $templateSubFolder.FullName $subAcl.SetSecurityDescriptorSddlForm($subAcl.Sddl.Split('S:')[0]) Set-Acl -Path $targetSubFolderPath -AclObject $subAcl } Write-host "Struktura katalogowa została utworzona" }catch{ Write-Error $_ pause }
额外验证项
如果修改后仍然报错,可以执行以下操作定位问题:
- 直接在PowerShell中手动执行
Get-Acl "\\srv\Projekty\PROJEKT TEMPLATE\01_Dokumenty_przed_oferta" | Set-Acl "\\srv\Projekty\2021\9_21_testv6\01_Dokumenty_przed_oferta",确认是否报错,排除代码逻辑问题 - 检查模板文件夹是否开启了强制继承之类的特殊权限配置,或者是否存在加密、属性为只读的情况
内容的提问来源于stack exchange,提问作者aarbuzik
相关产品推荐
相关产品推荐

