Как разрешения ICACL отображаются на FileSystemRights - PullRequest
0 голосов
/ 16 апреля 2020

Я пишу скрипт для копирования разрешений из одной структуры каталогов и повторного их применения к другой. Я не могу просто использовать icacls \\my\path\* /save file.acl /T, так как мне нужно сделать несколько настроек между сохранением и восстановлением, для которых проще работать с выводом (Get-ACL $path).Access PowerShell.

При этом я пытаясь отобразить выходные данные этого (то есть FileSystemRights ) к их эквивалентным icacls разрешениям ; Затем я заключу список разрешений в скобках, разделенный запятыми, для применения через icacls.

[string[]]$rights = $InputObject.FileSystemRights -split  '\s*,\s*' # note: FileSystemRights here is just a string rather than having been converted to ENUM, as I've just pulled it straight from CSV
switch ($rights) {
    'AppendData'                   {'AD'}
    #'ChangePermissions'           {'?'}
    #'CreateDirectories'           {'?'}
    'CreateFiles'                  {'WD'} # duplicate of WriteData
    'Delete'                       {'DE'} # or D?
    'DeleteSubdirectoriesAndFiles' {'DC'}
    'ExecuteFile'                  {'X'}
    'FullControl'                  {'F'}
    'ListDirectory'                {'RD'} #duplicate of read data
    'Modify'                       {'M'}
    'Read'                         {'R'} # or GR?
    'ReadAndExecute'               {'RX'}
    'ReadAttributes'               {'RA'}
    'ReadData'                     {'RD'}
    'ReadExtendedAttributes'       {'REA'}
    'ReadPermissions'              {'RC'}
    'Synchronize'                  {'S'}
    'TakeOwnership'                {'WO'}
    #'Traverse'                    {'?'} # or does this mean to specify the /T option?  Not really a permission
    'Write'                        {'W'} # or GW?
    'WriteAttributes'              {'WA'}
    'WriteData'                    {'WD'}
    'WriteExtendedAttributes'      {'WEA'}
    Default {Write-Warning "Could not find icacls permission for file system right: '$_'"} # Note: This may also occur if we get a numeric value for the rights instead of a comma separated list of enum names.  Once I've got the mapping I'll code a fix to handle that scenario too.
}

Вопрос

Я не уверен в отображении выше; в некоторых случаях я не мог понять, каково будет эквивалентное значение (например, ChangePermissions, CreateDirectories, Traverse), а в других есть несколько возможностей (например, если Read / Write отображается на R / W или GR / GW; или нет разницы)? Я проверил документацию и искал в Интернете, но большинство объяснений этих разрешений не go более подробно, чем дать названия для этих сокращений.

Дополнительный контекст

Когда я говорю, что я Мне нужно сделать несколько настроек, я экспортирую разрешения из старого общего файлового ресурса на старом домене и импортирую их в новый домен, поэтому мне нужно сопоставить количество учетных записей от пользователя старого домена с используемым SID в новом домене (у нас есть история SIDHistory, но мы стремимся делать все чисто, а не полагаться на этот долгосрочный период). В новом домене также есть группы, которые являются эквивалентами групп из старого домена, но не имеют отношения (т. Е. Они не переносятся из старого домена; хотя они служат по существу той же функциональной цели. Редактирование вывода сохраненная информация ICACLS является сложной, поскольку структура довольно минимальна. Это не невозможно, но гораздо сложнее, чем мне удобно.

Причина, по которой мне нужно сопоставить вещи с выхода PS /.Net на Формат icacls объясняется тем, что целевой ресурс находится в Azure файлах (с включенной AADDS), поэтому Set-ACL не работает, в то время как icacls работает.

Я создал аналогичные логи c для часть наследования уже:

[string[]]$if = $InputObject.InheritanceFlags -split '\s*,\s*'
[string[]]$pf = $InputObject.PropagationFlags -split '\s*,\s*'
switch ($if) {
    'ContainerInherit' {'(CI)'}
    'ObjectInherit' {'(OI)'}
}
switch ($pf) {
    'InheritOnly' {'(IO)'}
    'NoPropagateInherit' {'(NP)'}
}
if ($InputObject.IsInherited) {
    '(I)'
}

Для тех, кто не знаком с оператором переключения PowerShell: функциональность может обрабатывать каждый элемент в массиве, поэтому нет необходимости в логах c до l oop через каждый прямо в $rights. Подробнее здесь .

Обновление 2020-06-16 10: 00

Я только что понял, что есть е Любой способ увидеть, где FileSystemRights содержит дубликаты. Код ниже определяет их. Это решило мою проблему с Traverse и CreateDirectories.

[Enum]::GetNames([System.Security.AccessControl.FileSystemRights]) | 
   sort | 
   %{[PSCustomObject]@{
        Name = $_ 
        FSR = ([System.Security.AccessControl.FileSystemRights]$_)
   }} | 
   ft -AutoSize

Это показывает, что я могу повторно использовать некоторые из существующих значений

Name                                                  FSR
----                                                  ---
AppendData                                     AppendData
ChangePermissions                       ChangePermissions
CreateDirectories                              AppendData <-- i.e. AD
CreateFiles                                   CreateFiles
Delete                                             Delete
DeleteSubdirectoriesAndFiles DeleteSubdirectoriesAndFiles
ExecuteFile                                   ExecuteFile
FullControl                                   FullControl
ListDirectory                                    ReadData <-- i.e. RD
Modify                                             Modify
Read                                                 Read
ReadAndExecute                             ReadAndExecute
ReadAttributes                             ReadAttributes
ReadData                                         ReadData
ReadExtendedAttributes             ReadExtendedAttributes
ReadPermissions                           ReadPermissions
Synchronize                                   Synchronize
TakeOwnership                               TakeOwnership
Traverse                                      ExecuteFile <-- i.e. X
Write                                               Write
WriteAttributes                           WriteAttributes
WriteData                                     CreateFiles <-- i.e. WD
WriteExtendedAttributes           WriteExtendedAttributes

1 Ответ

0 голосов
/ 16 апреля 2020

Разрабатывая, как преобразовать то, что я считаю недействительными числовыми значениями c (то есть, думая, что они состоят из значений перечисления, хотя по какой-то причине не разрешается при приведении [System.Security.AccessControl.FileSystemRights]268435456), я наткнулся на этот пост , затем из найденного этот .

Учитывая информацию там и мои выводы о повторяющихся значениях в моем предыдущем обновлении, я сейчас написал отображение как это:

[string[]]$rights = $InputObject.FileSystemRights -split  '\s*,\s*' # note: FileSystemRights here is just a string rather than having been converted to ENUM, as I've just pulled it straight from CSV
switch ($rights) {

    '-2147483648'                  {'GR'}
    '268435456'                    {'GA'}
    '536870912'                    {'GE'}
    '1073741824'                   {'GW'}
    'AppendData'                   {'AD'}
    'ChangePermissions'            {'WDAC'}
    'CreateDirectories'            {'AD'} # duplicate of AppendData
    'CreateFiles'                  {'WD'} # duplicate of WriteData
    'Delete'                       {'DE'} # or D?
    'DeleteSubdirectoriesAndFiles' {'DC'}
    'ExecuteFile'                  {'X'}
    'FullControl'                  {'F'}
    'ListDirectory'                {'RD'} # duplicate of read data
    'Modify'                       {'M'}
    'Read'                         {'R'}
    'ReadAndExecute'               {'RX'}
    'ReadAttributes'               {'RA'}
    'ReadData'                     {'RD'}
    'ReadExtendedAttributes'       {'REA'}
    'ReadPermissions'              {'RC'}
    'Synchronize'                  {'S'}
    'TakeOwnership'                {'WO'}
    'Traverse'                     {'X'} # duplicate of ExecuteFile
    'Write'                        {'W'}
    'WriteAttributes'              {'WA'}
    'WriteData'                    {'WD'}
    'WriteExtendedAttributes'      {'WEA'}
    Default {Write-Warning "Could not find icacls permission for file system right: '$_'"} # Note: This may also occur if we get a numeric value for the rights instead of a comma separated list of enum names.  Once I've got the mapping I'll code a fix to handle that scenario too.
}

Для разрешения ChangePermissions для WDA C Я просто использовал Get-ACL и Set-ACL, чтобы назначить только ChangePermissions доступ уникальному пользователю в папке, затем использовал icacls для запроса прав этой папки.

...