Значение свойства 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[$_] }
Это должно быть больше upvotes. Качественный товар. –
Отличный ответ, хотя есть опечатка в '$ fsr = $ fsr -band (-bNOT $ _)'. Обратите внимание на двоичный '-bNOT' вместо логического' -not'. – JosefZ
@JosefZ Спасибо за головы. Исправлена. –