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

如何在PowerShell中创建IsInherited为True的FileSystemAccessRule?

如何创建IsInherited为True的FileSystemAccessRule?

测试场景中需要构造一个IsInherited属性为True的FileSystemAccessRule实例,但该类的构造函数未提供设置IsInherited的参数,且该属性为只读,直接赋值会抛出如下错误:

'IsInherited' is a ReadOnly property.

两种可行的解决方法:

1. 从实际文件/文件夹的ACL中读取继承规则

IsInherited属性本质是标识该权限规则是否从父对象继承而来,因此可以直接从一个存在继承权限的文件或文件夹的访问控制列表(ACL)中提取符合要求的规则,这种方式最贴近真实场景:

# 指定一个存在的、有权限继承的文件路径
$targetPath = "C:\Windows\System32\notepad.exe"
# 获取该文件的ACL
$acl = Get-Acl -Path $targetPath
# 筛选出IsInherited为True的规则,取第一个作为测试用例
$inheritedAccessRule = $acl.Access | Where-Object { $_.IsInherited -eq $true } | Select-Object -First 1

2. 通过反射修改只读属性

如果需要手动构造特定参数的规则,可以利用PowerShell的反射功能,修改FileSystemAccessRule实例的私有字段来设置IsInherited为True:

# 先创建一个常规的FileSystemAccessRule实例
$baseRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "NT AUTHORITY\SYSTEM",
    "FullControl",
    "None",
    "None",
    "Allow"
)

# 反射获取私有字段并修改其值
$privateField = $baseRule.GetType().GetField("_isInherited", [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Instance)
$privateField.SetValue($baseRule, $true)

# 验证修改结果
$baseRule

注意事项

  • 反射修改只读属性属于绕过设计限制的操作,仅建议用于测试场景,生产环境谨慎使用。
  • 若测试目的是匹配现有文件的继承规则,优先选择第一种方法,能保证规则的真实性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:05:01