我正在阅读一些代码,但无法弄清楚从哪里检索到某个属性(访问)。
这里是我正在查看的代码的片段。我删除了一些代码。这段代码是函数的一部分,因此是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的类型系统,有时也称为扩展类型系统(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
。未列为Property
,Method
或Property
的任何内容都是Powershell特定成员。
我不太清楚这很重要,但是您想要的访问属性信息是:
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(其他属性的扩展)。