Система типов PowerShell, иногда называемая расширенной системой типов (или ETS), работает путем прозрачного переноса собственных. NET объектов в PSObject
, что, в свою очередь, позволяет расширять типы без фактического изменение типа и идентификатора базового объекта.
В указанном вами случае c свойство Access
происходит из набора динамических свойств c, добавленных к экземплярам System.Security.AccessControl.ObjectSecurity
.
При просмотре данных типа, предоставляемых Get-TypeData
, мы можем даже увидеть, что они сопоставляются с методом stati c, предоставляемым классом, из которого 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
. Все, что не указано как Method
, Property
или Event
, является элементом PowerShell, определяемым c.