此“访问”属性在我的DirectorySecurity对象上来自哪里?

问题描述 投票:0回答:2

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

这里是我正在查看的代码的片段。我删除了一些代码。这段代码是函数的一部分,因此是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对象。该代码正常运行,并且access属性确实返回了数据,但是我在Microsoft文档中找不到此Access属性来源的任何信息。它未在DirectorySecurity对象上作为属性列出。我是否缺少一些DirectorySecurity继承的对象?

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

powershell acl
2个回答
0
投票

PowerShell的类型系统,有时也称为扩展类型系统(ETS),其工作原理是将本机.NET对象透明地包装在PSObject中,这反过来又使我们可以扩展类型,而无需实际修改基础对象的类型和标识。

如果是您的特定情况,则PSObject属性来自添加到Access实例的一组动态属性。

深入研究System.Security.AccessControl.ObjectSecurity公开的类型数据,我们甚至可以看到它映射到Get-TypeData派生的类公开的静态方法:

Get-Acl

尽管虽然不一定告诉您它来自何处,但$objectSecurityExtendedMembers = Get-TypeData -TypeName System.Security.AccessControl.ObjectSecurity|% Members $objectSecurityExtendedMembers['Access'] 会显示Get-Member是ETS(而不是本机.NET)属性:

Access

注意它是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。未列为PropertyMethodProperty的任何内容都是Powershell特定成员。


0
投票

我不太清楚这很重要,但是您想要的访问属性信息是:

Event

它来自System.Security.AccessControl.AuthorizationRuleCollection类,找到文档PS> $acl | gm -Name access TypeName: System.Security.AccessControl.DirectorySecurity Name MemberType Definition ---- ---------- ---------- Access CodeProperty System.Security.AccessControl.AuthorizationRuleCollection Access{get=GetAccess;} PS> $member = $acl | gm -Name access PS> $member | select * TypeName Name MemberType Definition -------- ---- ---------- ---------- System.Security.AccessControl.DirectorySecurity Access CodeProperty System.Security.AccessControl.AuthorizationRuleCollection Access{get=GetAccess;} 。正如AdminOfThings在他的评论中所说,它是here(其他属性的扩展)。

© www.soinside.com 2019 - 2024. All rights reserved.