这个 "access" 属性 来自我的 DirectorySecurity 对象的哪里?

Where is this "access" property coming from on my DirectorySecurity object?

我正在阅读一些代码,但我无法弄清楚某个 属性 访问权限是从哪里检索的。

这是我正在查看的代码片段。我已经删除了一些代码。此代码是函数的一部分,因此是 return 语句,但 func 代码的其余部分与此 post 无关。

if ($targetObjType -eq "DirectoryInfo") {
                $fileFolderObjs = @(Get-ChildItem $target -force -recurse -Directory -ErrorAction SilentlyContinue)
}
$fileFolderObjs | ForEach-Object {
            $fileFolderObj = $_
            try {
                $ACL = $fileFolderObj.GetAccessControl()
            }
            catch {
                write-host "error"
                return
            }
            if (!$ACL) {
                return
            }
            $access = $ACL | Select-Object -ExpandProperty Access #ACLs. Not seeing this property as existing in DirectorySecurity class documentation. 
}

所以我应该检索 DirectoryInfo 对象,对它们调用 GetAccessControl(),然后在 return 中取回 DirectorySecurity 对象。代码运行正常并且 access 属性 执行 return 数据,但我无法在 Microsoft 文档中找到有关此 Access 属性 来自何处的任何信息。它没有在 DirectorySecurity 对象上列为 属性。我是否缺少 DirectorySecurity 继承自的某些对象?

如有任何帮助,我们将不胜感激。谢谢

PowerShell 的类型系统,有时称为扩展类型系统(或 ETS),通过透明地将本机 .NET 对象包装在 PSObject 中工作,这反过来又允许我们扩展类型而无需实际修改类型和底层对象的标识。

在您的特定情况下,Access 属性 来自添加到 System.Security.AccessControl.ObjectSecurity 实例的一组动态属性。

深入研究 Get-TypeData 公开的类型数据,我们甚至可以看到它映射到 class 公开的静态方法,Get-Acl 从中派生:

$objectSecurityExtendedMembers = Get-TypeData -TypeName System.Security.AccessControl.ObjectSecurity|% Members
$objectSecurityExtendedMembers['Access']

虽然它不一定会告诉您它来自哪里,但 Get-Member 会显示 Access 是 ETS(而不是本地 .NET)属性:

PS C:\> Get-Acl |Get-Member


   TypeName: System.Security.AccessControl.DirectorySecurity

Name                            MemberType     Definition
----                            ----------     ----------
Access                          CodeProperty   System.Security.AccessControl.AuthorizationRuleCollection Access{get=GetAccess;}
CentralAccessPolicyId           CodeProperty   System.Security.Principal.SecurityIdentifier CentralAccessPolicyId{get=GetCentra...
CentralAccessPolicyName         CodeProperty   System.String CentralAccessPolicyName{get=GetCentralAccessPolicyName;}
Group                           CodeProperty   System.String Group{get=GetGroup;}
Owner                           CodeProperty   System.String Owner{get=GetOwner;}
Path                            CodeProperty   System.String Path{get=GetPath;}
Sddl                            CodeProperty   System.String Sddl{get=GetSddl;}
AccessRuleFactory               Method         System.Security.AccessControl.AccessRule AccessRuleFactory(System.Security.Princ...
AddAccessRule                   Method         void 

请注意它是 CodeProperty 而不是常规的 Property。未列为 MethodPropertyEvent 的任何内容都是特定于 PowerShell 的成员。