批量删除文件权限中已删除用户的未知SID权限条目失败,寻求解决方案
批量删除文件权限中已删除用户的未知SID权限条目失败,寻求解决方案
我完全懂你现在的糟心处境——手动通过GUI删单个文件的未知SID权限没问题,但要处理500个文件的话,手动操作简直是噩梦。用icacls命令没效果,找的PowerShell脚本又因为缺AD组件报错,下面给你几个靠谱的解决方案:
先排查并修正icacls命令的问题
你之前用的/remove:d参数只针对**拒绝(Deny)**权限条目,但有时候这个未知SID可能还存在其他类型的权限,或者参数使用有问题,你可以试试以下调整:
- 去掉
:d参数,直接删除该SID的所有权限条目:icacls C:\test\Admin\*.* /remove *S-1-5-21-2076865150-1137883396-1755809354-1013 /t /c - 确认路径覆盖范围:
*.*可能没包含子文件夹里的无后缀文件,换成C:\test\Admin\*试试,确保遍历所有内容 - 务必用管理员权限打开命令提示符,权限不足会导致命令看似执行成功但实际没修改任何内容
不依赖AD模块的PowerShell解决方案
你找到的脚本需要AD管理模块(Get-ADRootDSE是AD模块的命令),如果你的机器没装AD工具包就会报错。下面这个独立脚本不需要AD组件,直接遍历文件并删除指定SID的权限:
# 目标路径和要删除的SID $targetPath = "C:\test\Admin" $sidToRemove = "S-1-5-21-2076865150-1137883396-1755809354-1013" # 递归遍历所有文件和子文件夹(包含隐藏/系统文件) Get-ChildItem -Path $targetPath -Recurse -Force | ForEach-Object { # 获取当前文件/文件夹的ACL $acl = Get-Acl -Path $_.FullName -ErrorAction SilentlyContinue if ($acl) { # 筛选出属于目标SID的所有权限规则 $rulesToDelete = $acl.Access | Where-Object { $_.IdentityReference.Value -eq $sidToRemove } foreach ($rule in $rulesToDelete) { $acl.RemoveAccessRule($rule) | Out-Null } # 应用修改后的权限 try { Set-Acl -Path $_.FullName -AclObject $acl -ErrorAction Stop Write-Host "✅ 成功更新权限: $($_.FullName)" } catch { Write-Warning "❌ 更新失败: $($_.FullName) - $_" } } else { Write-Warning "⚠️ 无法获取ACL: $($_.FullName)" } }
使用提示:
- 用管理员权限打开PowerShell
- 把脚本里的路径和SID换成你的实际信息
- 执行脚本后,会输出每个文件的处理结果,方便你排查问题
备选工具:微软官方的SubInACL
如果你不想写脚本,可以试试微软的SubInACL工具(专门用于批量权限管理),安装后执行以下命令:
subinacl /subdirectories "C:\test\Admin\*" /deleteuser=S-1-5-21-2076865150-1137883396-1755809354-1013
这个工具会递归处理目标路径下的所有文件和文件夹,直接删除指定SID的所有权限条目。
备注:内容来源于stack exchange,提问作者Alcor Prism




