Реакция из текстового файла
Этот ставит меня в тупик. Я пытаюсь сделать это с 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"
Дайте мне знать, если у вас есть вопросы или проблемы.