如何在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
相关产品推荐
相关产品推荐

