powershell通过get-acl的areaccessrulesprotected属性批量检查ntfs继承状态:false表示继承开启,true表示禁用;需自下而上比对父子目录状态定位中断点,并结合effectiveaccess验证真实权限。
在 windows server 中批量检查 ntfs 权限继承状态,核心是快速识别哪些目录“主动断开了继承”,而非逐个点开属性查看。powershell 是最可靠、可脚本化的方式,重点不在查子目录本身,而是沿路径向上定位继承链的断点。
一、用 Get-Acl 快速筛查继承开关状态
继承是否启用,由 AreAccessRulesProtected 属性决定:True = 继承已禁用,False = 继承开启。该属性对每个对象独立生效。
- 检查单个路径:(Get-Acl "D:\Data\Reports").AreAccessRulesProtected
- 批量检查多个目录(如从 CSV 读取):
Import-Csv "paths.csv" | ForEach-Object {
$path = $_.Path
if (Test-Path $path) {
$acl = Get-Acl $path
[PSCustomObject]@{
Path = $path
InheritanceEnabled = -not $acl.AreAccessRulesProtected
IsInherited = $acl.Access | Where-Object {$_.IsInherited} | Measure | Select-Object -ExpandProperty Count -ErrorAction SilentlyContinue
}
}
}
二、定位继承中断点:自下而上比对父子状态
子目录继承失败,往往因为某一级父目录禁用了继承,或设置了“替换子对象权限”但未执行。需对比父子对象的 AreAccessRulesProtected 和实际 ACL 是否一致。
将提醒同步至 Windows/Outlook 日历。用户提及「提醒我」「设置提醒」「加到日历」「同步到日历」「日程」「calendar」「日历」时触发。支持Microsoft Graph API 设备代码流认证,无需 Web 服务器,直接写入用户 Outlook 日历。
- 对目标子目录及其直接父目录分别运行:
(Get-Acl "D:\Data\Reports\Q3").AreAccessRulesProtected
(Get-Acl "D:\Data\Reports").AreAccessRulesProtected - 若子目录为 True、父目录为 False → 子目录被手动禁用继承
- 若两者均为 False,但子目录未获得预期权限 → 检查父目录是否勾选了“替换所有子对象的权限项”(图形界面)或是否执行过 /reset /t(命令行)
三、识别“伪继承”:有继承标记却无实际权限
有时子目录显示“继承自 XXX”,但权限条目为空或不完整——常见于所有权缺失或权限被拒绝条目覆盖。
- 检查子目录是否能被当前用户修改权限:
(Get-Acl "D:\Data\Reports\Q3").Access | Where-Object {$_.IdentityReference -eq "$env:USERDOMAIN\$env:USERNAME"} | Select-Object FileSystemRights, AccessControlType - 若返回空,且你拥有管理员身份,说明你不是所有者或缺少“更改权限”ACE → 需先获取所有权再重置继承
- 用 Get-EffectiveAccess 验证真实效果(需 PowerShell 5.1+):
Get-Acl "D:\Data\Reports\Q3" | Get-EffectiveAccess -UserName "DOMAIN\Admin" | Where-Object {$_.AccessType -eq "Allow"}
四、导出全树继承状态报告(适合审计)
对整个共享根目录递归扫描,生成结构化报告,便于发现异常层级:
- 命令示例(仅检查文件夹,跳过文件):
Get-ChildItem "D:\Data" -Directory -Recurse -ErrorAction SilentlyContinue | ForEach-Object {
$acl = try { Get-Acl $_.FullName -ErrorAction Stop } catch { $null }
if ($acl) {
[PSCustomObject]@{
FullName = $_.FullName
IsInheritanceDisabled = $acl.AreAccessRulesProtected
Owner = $acl.Owner
InheritedCount = ($acl.Access | Where-Object {$_.IsInherited}).Count
ExplicitCount = ($acl.Access | Where-Object {!$_.IsInherited}).Count
}
}
} | Export-Csv "InheritanceReport.csv" -NoTypeInformation










