Реакция из текстового файла

Этот ставит меня в тупик. Я пытаюсь сделать это с PowerShell, но это не должно быть...

По сути, у меня есть текстовый файл, содержащий информацию ACL для большой структуры каталогов, которая была перенесена (я понимаю, что из содержимого есть что-то, что можно пожелать, но мы больше не можем получить доступ к исходной файловой системе, так что это то, что мы должны работать с).

Мне нужно сгенерировать пакетный файл для повторного доступа к новой (скопированной) файловой системе.

Итак, в двух словах, мне нужно преобразовать текст следующим образом (извините за прокрутку, но я пытаюсь сохранить межстрочный интервал):

Path: \\Share.Domain.com\Directory01$\Subdirectory01


AccessToString : DOMAIN\Group01-Knuckleheads Allow  ReadAndExecute, Synchronize
     BUILTIN\Administrators 



Path: \\Share.Domain.com\Directory02$\Subdirectory01


AccessToString : DOMAIN\Different-Group02 Allow  FullControl
                 BUILTIN\Administrators Allow  FullControl

В новые файлы (или те же файлы, на самом деле не имеет значения) с таким содержимым:

ICacls "\\Share.Domain.com\Directory01$\Subdirectory01" /Grant "DOMAIN\Group01-Knuckleheads":(OI)(CI)R,X,S /t /c /l /q /inheritance:r
ICacls "\\Share.Domain.com\Directory01$\Subdirectory01" /Grant "BUILTIN\Administrators":(OI)(CI)F /t /c /l /q /inheritance:r
ICacls "\\Share.Domain.com\Directory02$\Subdirectory01" /Grant "DOMAIN\Different-Group02":(OI)(CI)F /c /l /q /inheritance:r
ICacls "\\Share.Domain.com\Directory02$\Subdirectory01" /Grant "BUILTIN\Administrators":(OI)(CI)F /c /l /q /inheritance:r

Моя полу-жалкая попытка решить эту проблему все еще продолжается, но я понимаю, что этот враг больше моего моджо:

    #$ACLs = Get-Content C:\Scripts\Test\AndTest.txt
    #ForEach-Object ($ACL in $ACLs)
    #{
    #Figure out how to break strings into variables....
    #}
    #Declare Var - Need to populate from the imported text file
    $FilePath = "\\Share.Domain.com\Directory01$\Subdirectory01"
    $GroupName = "DOMAIN\Domain Admins"
    $TestPerm = "ReadAndExecute"
    If ($TestPerm = "FullControl"){$Perms = "F"}
    Elseif ($TestPerm = "ReadAndExecute"){$Perms = "RX"}
    Elseif ($TestPerm = "Modify"){$Perms = "M"}
    Elseif ($TestPerm = "Deny"){$Perms = "D"}
    Elseif ($TestPerm = "Read"){$Perms = "R"}
    Elseif ($TestPerm = "Write"){$Perms = "W"}
    cls
    #Build icacls string -Test Output
    Write-Host "ICacls ""$FilePath"" /Grant ""$GroupName"":(OI)(CI)$Perms /t /c /l /q /inheritance:r"
    #Write icacls batch file
    #Out-File "C:\Scripts\Test\re-acl.cmd" "ICacls ""$FilePath"" /Grant ""$GroupName"":(OI)(CI)$Perms /t /c /l /q /inheritance:r"

Я понимаю, что здесь есть много работы, и я только начинаю понимать это. Например, я думаю, что мне нужно перечислить разрешения в массив и построить строку как таковую. Там также обязательно должны быть специальные разрешения и т.д...

Но сейчас я пытаюсь выяснить, как импортировать текстовый файл, а затем разбить его на переменные... Как я уже сказал, я работаю в Powershell, но это действительно может быть что угодно... VB или Python, возможно?

Большое спасибо заранее!

1 ответ

Хорошо, я думаю, что большая часть вашей проблемы - анализ текста, так что в основном это то, что мне помогло здесь. Я построил строки, и если у вас есть больше разрешений, которые вы хотите включить, вы сможете выяснить, как добавить их в switch, Для этого мы хотим прочитать весь текстовый файл в виде большой многострочной строки. Затем мы разбиваем его на части по ключевому слову "Path:". Затем для каждой записи я получаю путь в виде строки, получаю разрешения и анализирую учетные записи, разрешаю / запрещаю и индивидуальный доступ. Затем я преобразовываю доступ в короткие версии, принятые icacls, и строю аргументы в виде отформатированной строки.

Я вывожу на хост, но как только вы убедитесь, что он выглядит правильно для вас, вы можете удалить Write-Host " и отставание " и он просто выполнит его (при условии, что icacls находится в той же папке, в которой вы находитесь, или в переменной окружения PATH).

$Text = Get-Content C:\Scripts\Test\AndTest.txt -Raw
$Records = $Text -split "(?s)(Path:.*?)(?=Path:|$)"|?{$_}
#Loop through each file/ACL
ForEach($Record in $Records){
    $FilePath = ($Record -split "[\r\n]+")[0].Substring(6)
    $PermRecords = ($Record -split "(?s)AccessToString : "|Select -skip 1) -split "[\r\n]+"|?{$_}
    $Perms = $PermRecords|?{$_ -match "(.*\\.*?)\s+(Allow|Deny)(.*)$"}|%{[pscustomobject]@{'Account'=$Matches[1].Trim();'Type'=$Matches[2];'Perms'=$Matches[3].Trim()}}
    #Loop through each perm for the current file
    $Perms | %{
        #Convert friendly names to abbreviations
        $ShortPerms = ''
        Switch -regex ($_.Perms){
            "FullControl" {$ShortPerms = "F";Continue}
            "ReadAndExecute" {$ShortPerms += "RX,"}
            "Synchronize" {$ShortPerms += "S,"}
            "Modify" {$ShortPerms += "M,"}
            "Read(?=,|$)" {$ShortPerms += "R,"}
            "Write" {$ShortPerms += "W,"}
        }
        $ShortPerms = $ShortPerms.TrimEnd(',')
        $Arguments = '"{0}" /{4} "{1}":(OI)(CI)({2}) /t /c /l /q /inheritance:r' -f $FilePath, $_.Account, $ShortPerms,$(If($_.Type -eq 'Allow'){'Grant'}else{'Deny'})
        write-host "& ICAcls $Arguments"
    }
}

Если -Raw аргумент не работает для вас, вы можете обойти это с

(Get-Content C:\Scripts\Test\AndTest.txt) -join "`r`n"

Дайте мне знать, если у вас есть вопросы или проблемы.

Другие вопросы по тегам