Откуда происходит это свойство «access» в моем объекте DirectorySecurity? - PullRequest
1 голос
/ 06 апреля 2020

Я читаю некоторый код и не могу понять, откуда извлекается определенное свойство, доступ.

Вот фрагмент кода, на который я смотрю. Я удалил часть кода. Этот код является частью функции, отсюда и операторы return, но остальная часть забавного кода c не относится к этому сообщению.

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?

Буду признателен за любую помощь. Спасибо

1 Ответ

4 голосов
/ 06 апреля 2020

Система типов 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.

...