Неожиданный вывод из Get-ACL | Выберите Доступ - PullRequest
0 голосов
/ 06 сентября 2018

Неожиданный вывод из Get-ACL | Выберите Доступ

Если я не Select свойство Access, то содержимое отображается по моему желанию. например BUILTIN\Administrators Allow FullControl.

Но если I Select свойство Access, вместо него отображается тип объекта (System.Security.AccessControl.FileSystemAccessRule):

PS C:\tmp> Get-Acl .\test | Format-List


Path   : Microsoft.PowerShell.Core\FileSystem::C:\tmp\test
Owner  : EXAMPLE\sjobs
Group  : EXAMPLE\Domain Users
Access : BUILTIN\Administrators Allow  FullControl
         BUILTIN\Administrators Allow  268435456
         NT AUTHORITY\SYSTEM Allow  FullControl
         NT AUTHORITY\SYSTEM Allow  268435456
         BUILTIN\Users Allow  ReadAndExecute, Synchronize
         NT AUTHORITY\Authenticated Users Allow  Modify, Synchronize
         NT AUTHORITY\Authenticated Users Allow  -536805376
Audit  :
Sddl   : REDACTED



PS C:\tmp> Get-Acl .\test | Select Access | Format-List


Access : {System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule,
     System.Security.AccessControl.FileSystemAccessRule, System.Security.AccessControl.FileSystemAccessRule...}

Я больше знаком с bash, чем с PowerShell. Но я понимаю, что PowerShell склонен передавать объекты вместо строк.

Почему эти два дисплея по-разному Access?

Что еще более важно, как отобразить только свойство Access, как я хочу?

1 Ответ

0 голосов
/ 06 сентября 2018

Если вы посмотрите на тип объекта, он даст некоторые подсказки.

PS C:\Users\jacob> $acl = get-acl

PS C:\Users\jacob> $acl.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                              
-------- -------- ----                                     --------                                                                                              
True     False    DirectorySecurity                        System.Security.AccessControl.FileSystemSecurity                                                      

PS C:\Users\jacob> ($acl | select access).getType()

IsPublic IsSerial Name                                     BaseType                                                                                              
-------- -------- ----                                     --------                                                                                              
True     False    PSCustomObject                           System.Object  

С помощью PSCustomObject вы можете получить доступ к значениям свойств, используя обозначения .psobject.Properties.value или ..

Итак, если мы изолируем объект acesss $access = $acl | select access и затем обращаемся к значениям свойств, мы получаем информацию, к которой мы стремимся.

PS C:\Users\jacob> $access.PSObject.Properties.Value


FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : NT AUTHORITY\SYSTEM
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : BUILTIN\Administrators
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : SURFACE\jacob
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

В одну строку:

get-acl .\test | select access | % { $_.PSObject.Properties.Value }

Или мы можем урезать его до

get-acl .\test | select access | % { $_.Access }

Или, наконец:

(get-acl .\test | select access).access
...