首页 > 解决方案 > 我的 DirectorySecurity 对象上的这个“访问”属性来自哪里?

问题描述

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

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

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(),并返回一个 DirectorySecurity 对象。代码运行正常并且访问属性确实返回数据,但我在 Microsoft 文档中找不到有关此 Access 属性来自何处的任何信息。它未列为 DirectorySecurity 对象的属性。我是否缺少 DirectorySecurity 继承的某些对象?

任何帮助,将不胜感激。谢谢

标签: powershellacl

解决方案


PowerShell 的类型系统,有时也称为扩展类型系统(或 ETS),其工作原理是将原生 .NET 对象透明地包装在 aPSObject中,这反过来又允许我们在不实际修改底层对象的类型和标识的情况下扩展类型。

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

深入研究 公开的类型数据Get-TypeData,我们甚至可以看到它映射到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 

注意它是如何说它是 aCodeProperty而不是常规的Property。未列为 的任何内容MethodProperty或者Event是特定于 PowerShell 的成员。


推荐阅读