2015-01-19 1 views
5

Использование Get-Acl Я пытаюсь получить права доступа к папке. Дело в том, что для некоторых групп я получаю число вместо типа доступа. Пример ниже:Извлечение дескриптора безопасности и получение номера для FileSystemRights

get-acl "C:\TestFolder" | % {$_.access} 
FileSystemRights : -536805376 
AccessControlType : Allow 
IdentityReference : TestDomain\Support 
IsInherited  : False 
InheritanceFlags : ObjectInherit 
PropagationFlags : InheritOnly 

Есть ли способ перевести этот номер на свое имя?

ответ

4

Быстрый и грязный tanslation:

268435456 - FullControl

-536805376 - Изменить, Синхронизировать

-1610612736 - ReadAndExecute, Синхронизировать

Если вы хотите узнать о процессе перевода этого был лучшим, что я мог найти на данный момент: Link

9

Значение свойства FileSystemRights представляет собой 32-битовое целое без знака, где каждый бит представляет конкретное разрешение доступа. Большинство разрешений перечислены в Win32_ACE class documentation, за исключением «общих» разрешений (бит 28-31) и права доступа к SACL (бит   23). Более подробную информацию вы можете найти here и here.

Если вы хотите, чтобы сломать маску доступа ACE в своих конкретных прав доступа (vulgo «расширенные права доступа») вы могли бы сделать что-то вроде этого:

$accessMask = [ordered]@{ 
    [uint32]'0x80000000' = 'GenericRead' 
    [uint32]'0x40000000' = 'GenericWrite' 
    [uint32]'0x20000000' = 'GenericExecute' 
    [uint32]'0x10000000' = 'GenericAll' 
    [uint32]'0x02000000' = 'MaximumAllowed' 
    [uint32]'0x01000000' = 'AccessSystemSecurity' 
    [uint32]'0x00100000' = 'Synchronize' 
    [uint32]'0x00080000' = 'WriteOwner' 
    [uint32]'0x00040000' = 'WriteDAC' 
    [uint32]'0x00020000' = 'ReadControl' 
    [uint32]'0x00010000' = 'Delete' 
    [uint32]'0x00000100' = 'WriteAttributes' 
    [uint32]'0x00000080' = 'ReadAttributes' 
    [uint32]'0x00000040' = 'DeleteChild' 
    [uint32]'0x00000020' = 'Execute/Traverse' 
    [uint32]'0x00000010' = 'WriteExtendedAttributes' 
    [uint32]'0x00000008' = 'ReadExtendedAttributes' 
    [uint32]'0x00000004' = 'AppendData/AddSubdirectory' 
    [uint32]'0x00000002' = 'WriteData/AddFile' 
    [uint32]'0x00000001' = 'ReadData/ListDirectory' 
} 

$fileSystemRights = Get-Acl -LiteralPath 'C:\some\folder_or_file' | 
        Select-Object -Expand Access | 
        Select-Object -Expand FileSystemRights -First 1 

$permissions = $accessMask.Keys | 
       Where-Object { $fileSystemRights.value__ -band $_ } | 
       ForEach-Object { $accessMask[$_] } 

Простого разрешения FullControl, Modify, ReadAndExecute и т. д. являются лишь конкретными комбинациями этих расширенных разрешений. ReadAndExecute, например, представляет собой комбинацию из следующих расширенных разрешений:

  • ReadData/ListDirectory
  • Execute/Traverse
  • ReadAttributes
  • ReadExtendedAttributes
  • ReadControl

поэтому маска доступа для ReadAndExecute будет иметь т он ценит 131241.

Если вы хотите, чтобы результат сочетания простого разрешения, а остальные расширенные права доступа, вы могли бы сделать что-то вроде этого:

$accessMask = [ordered]@{ 
    ... 
} 

$simplePermissions = [ordered]@{ 
    [uint32]'0x1f01ff' = 'FullControl' 
    [uint32]'0x0301bf' = 'Modify' 
    [uint32]'0x0200a9' = 'ReadAndExecute' 
    [uint32]'0x02019f' = 'ReadAndWrite' 
    [uint32]'0x020089' = 'Read' 
    [uint32]'0x000116' = 'Write' 
} 

$fileSystemRights = Get-Acl -LiteralPath 'C:\some\folder_or_file' | 
        Select-Object -Expand Access | 
        Select-Object -Expand FileSystemRights -First 1 

$fsr = $fileSystemRights.value__ 

$permissions = @() 

# get simple permission 
$permissions += $simplePermissions.Keys | ForEach-Object { 
        if (($fsr -band $_) -eq $_) { 
        $simplePermissions[$_] 
        $fsr = $fsr -band (-bnot $_) 
        } 
       } 

# get remaining extended permissions 
$permissions += $accessMask.Keys | 
       Where-Object { $fsr -band $_ } | 
       ForEach-Object { $accessMask[$_] } 
+0

Это должно быть больше upvotes. Качественный товар. –

+1

Отличный ответ, хотя есть опечатка в '$ fsr = $ fsr -band (-bNOT $ _)'. Обратите внимание на двоичный '-bNOT' вместо логического' -not'. – JosefZ

+0

@JosefZ Спасибо за головы. Исправлена. –