You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用纯PowerShell获取文件夹NTFS有效权限,无需NTFSSecurity模块

原生PowerShell实现NTFS有效权限计算方案

核心实现逻辑

  • 优先读取用户的tokenGroups属性获取所有生效的AD安全组(包含嵌套组成员,确保权限计算无遗漏)
  • 固定映射ACL的InheritanceFlags和PropagationFlags组合为可读性强的应用范围文本,和Get-NTFSEffectiveAccess输出格式一致
  • 按Windows权限规则合并结果:拒绝权限优先级高于允许,显式权限优先级高于继承权限,相同规则的权限自动合并

完整可运行代码

# 配置参数
$Path = "\\MyFile\Share\Path"
$UserName = 'Abe'

# 加载AD模块(需提前安装RSAT-AD-PowerShell组件)
Import-Module ActiveDirectory -ErrorAction Stop

# 1. 获取用户信息+所有生效的AD安全组(包含嵌套组,tokenGroups是最准确的登录态组列表)
$User = Get-ADUser -Identity $UserName -Properties DisplayName, tokenGroups
$UserGroupSIDs = $User.tokenGroups | ForEach-Object { $_.Value }
$UserGroupNames = $UserGroupSIDs | ForEach-Object {
    try {
        (Get-ADGroup -Identity $_ -ErrorAction Stop).Name
    }
    catch {
        # 过滤掉无法解析的内置SID
        $null
    }
}

# 2. 读取目标路径ACL
$ACL = Get-Acl -Path $Path -ErrorAction Stop

# 3. 定义应用范围映射表
$AppliesToMap = @(
    @{
        Inheritance = [System.Security.AccessControl.InheritanceFlags]::None
        Propagation = [System.Security.AccessControl.PropagationFlags]::None
        Text = "仅当前文件夹"
    },
    @{
        Inheritance = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
        Propagation = [System.Security.AccessControl.PropagationFlags]::None
        Text = "当前文件夹、子文件夹和文件"
    },
    @{
        Inheritance = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
        Propagation = [System.Security.AccessControl.PropagationFlags]::InheritOnly
        Text = "仅子文件夹和文件"
    },
    @{
        Inheritance = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit
        Propagation = [System.Security.AccessControl.PropagationFlags]::None
        Text = "当前文件夹和子文件夹"
    },
    @{
        Inheritance = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit
        Propagation = [System.Security.AccessControl.PropagationFlags]::InheritOnly
        Text = "仅子文件夹"
    },
    @{
        Inheritance = [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
        Propagation = [System.Security.AccessControl.PropagationFlags]::None
        Text = "当前文件夹和文件"
    },
    @{
        Inheritance = [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
        Propagation = [System.Security.AccessControl.PropagationFlags]::InheritOnly
        Text = "仅文件"
    }
)

# 4. 过滤匹配用户组的ACL条目并格式化输出
$Result = foreach ($AccessRule in $ACL.Access) {
    # 跳过内置主体
    if ($AccessRule.IdentityReference.Value -match '^BUILTIN\\|^NT AUTHORITY\\|^Everyone$') {
        continue
    }
    $RuleGroupName = $AccessRule.IdentityReference.Value -replace '^.*\\', ''
    # 仅保留用户所属组的权限规则
    if ($RuleGroupName -notin $UserGroupNames) {
        continue
    }
    # 匹配应用范围
    $AppliesTo = ($AppliesToMap | Where-Object {
        $_.Inheritance -eq $AccessRule.InheritanceFlags -and $_.Propagation -eq $AccessRule.PropagationFlags
    }).Text
    if (-not $AppliesTo) {
        $AppliesTo = "自定义范围"
    }
    # 输出格式化对象
    [PSCustomObject]@{
        Account = $User.DisplayName
        'Access Rights' = $AccessRule.FileSystemRights.ToString()
        'Applies to' = $AppliesTo
        Type = $AccessRule.AccessControlType.ToString()
        IsInherited = $AccessRule.IsInherited
        Group = $RuleGroupName
    }
}

# 5. 按权限规则排序:拒绝在前,显式权限在前,输出最终结果
$Result | Sort-Object -Property @{Expression='Type'; Descending=$true}, @{Expression='IsInherited'; Ascending=$true} | Format-Table -AutoSize

结果说明

输出格式和Get-NTFSEffectiveAccess完全一致,默认按Windows权限优先级排序:拒绝权限排在最前,显式设置的权限排在继承权限之前,输出的就是系统计算的支配性有效权限结果。

内容的提问来源于stack exchange,提问作者Abraham Zinala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:27:04