Я пишу скрипт для копирования разрешений из одной структуры каталогов и повторного их применения к другой. Я не могу просто использовать 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