PowerShell中NTFSSecurity模块无法递归删除未解析SID求助
未解析SID清理失败问题排查与解决方案
问题根因
- 管道参数绑定不匹配:
Get-NTFSOrphanedAccess返回的对象结构无法直接匹配Remove-NTFSAccess的默认管道接收参数,直接串联调用无法正确传递路径和账户信息 - 权限不足:未以管理员身份运行PowerShell,无目标目录的ACL修改权限
- 确认机制触发:默认执行删除权限修改需要人工确认,未添加跳过确认参数的情况下命令不会实际执行删除操作
修复后的NTFSSecurity模块可用脚本
# 请先以管理员身份启动PowerShell Get-ChildItem -Path '*my directory*' -Recurse -ErrorAction SilentlyContinue | ForEach-Object { $currPath = $_.FullName # 逐路径获取当前路径下的未解析SID权限条目 Get-NTFSOrphanedAccess -Path $currPath | ForEach-Object { # 显式传递路径和账户参数执行删除,跳过确认提示 Remove-NTFSAccess -Path $currPath -Account $_.Account -Confirm:$false -ErrorAction SilentlyContinue } }
原生PowerShell替代方案(无需第三方模块,企业环境兼容性更高)
# 无需安装NTFSSecurity模块,直接调用系统接口清理未解析SID Get-ChildItem -Path '*my directory*' -Recurse -ErrorAction SilentlyContinue | ForEach-Object { $currPath = $_.FullName try { $acl = Get-Acl -Path $currPath -ErrorAction Stop } catch { Write-Warning "无法读取路径 $currPath 的ACL权限:$_" continue } # 筛选未解析的SID权限条目,排除系统内置SID $invalidRules = $acl.Access | Where-Object { $idRef = $_.IdentityReference if ($idRef.Value -notmatch '^S-1-') { return $false } # 排除已知系统内置SID无需清理 if ($idRef.Value -match '^S-1-(5-18|5-11|1-0|5-32-.+)') { return $false } # 验证SID是否可解析 try { $idRef.Translate([System.Security.Principal.NTAccount]) | Out-Null return $false } catch { return $true } } # 批量删除无效权限条目 foreach ($rule in $invalidRules) { try { $acl.RemoveAccessRule($rule) | Out-Null Set-Acl -Path $currPath -AclObject $acl -ErrorAction Stop } catch { Write-Warning "修改路径 $currPath 权限失败:$_" } } }
执行注意事项
- 操作前务必全量备份目标目录的ACL权限,避免误删正常权限引发业务故障
- 先选取小范围测试目录验证脚本有效性,确认无异常后再全量执行
- 必须以管理员身份运行脚本,确保拥有所有目标目录的所有权和ACL修改权限
- 85000+条目建议分批次执行,避免长时间占用磁盘IO和CPU资源影响业务
内容的提问来源于stack exchange,提问作者jknotts
相关产品推荐
相关产品推荐

