0

이 파일은 저에게 엉망입니다. PowerShell을 사용하여이 작업을 수행하려고 시도하지만 ... 필요하지 않습니다.텍스트 파일의 Re-acl

기본적으로 마이그레이션 된 큰 디렉토리 구조에 대한 ACL 정보가 들어있는 텍스트 파일이 있습니다. 내용에서 바라지 만 더 이상 원래 파일 시스템에 액세스 할 수 없으므로이 파일을 우리가 처리해야합니다.

새로운 (복사 된) 파일 시스템을 다시 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 
새 파일로

(또는 동일한 파일을, 아무튼 이 같은 내용에 '문제가 정말 t)이 아웃 작업

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 또는 파이썬 아마?

미리 감사드립니다.

+0

이 작업을 수행하는 더 쉬운 방법이있을 것이라고 생각합니다. GetAccessControls() 메소드를 사용하여 파일에 설정된 액세스 권한을 읽을 수 있습니다. '(ls foo.txt) .GetAccessControl()'과 같이 시도해보십시오. 동시에 두 폴더에 액세스 할 수 있다면 그 방법으로 쉽게 전송할 수 있습니다. 그들을 설정하는'SetAccessControl()'메소드가 있는데, 나는 결코 그것을 사용하지 않는다고 생각했다. – n3wjack

+0

@ n3wjack _but 우리는 더 이상 원래의 파일 시스템에 액세스 할 수 없습니다. _ – Matt

+0

정확히 ...무슨 일이 있었는지, 우리는 이것을 제대로 수행 한 일부 스크립트를 가지고 있었고,이 간단한 스크립트를 작성하여 사람이 읽을 수있는 형식으로 암자를 덤프했습니다. 내 동료 중 한 명이 그것을 사용하라는 요청을 받았지만 실행하지 못했습니다. 원래 ... 나는 컷 오버 후에 만 ​​발견했다 ... –

답변

1

좋아, 대부분의 문제는 텍스트를 파싱하는 것 같아요. 그래서 여기에서 주로 도움이되었습니다. 나는 문자열을 만들었고 포함하려는 권한이 더 많은 경우 switch에 추가하는 방법을 알아낼 수 있어야합니다. 이를 위해 우리는 전체 텍스트 파일을 큰 여러 줄 문자열로 읽으려고합니다. 그런 다음 "경로 :"라는 키워드를 기반으로 여러 부분으로 나누었습니다. 그런 다음 각 레코드에 대해 경로를 문자열로 가져와 사용 권한을 부여하고 계정을 분석하고 허용/거부 및 개별 액세스를 분석합니다. 그런 다음 액세스를 icacls에서 허용하는 짧은 버전으로 변환하고 인수를 형식화 된 문자열로 빌드합니다. 호스트에

I 출력, 당신이 당신에게 잘 보이는 것을 만족하지만, 일단 당신이 Write-Host " 및 후행 "을 제거 할 수 있고 그냥 실행됩니다 (ICACLS 가정은 당신이있어 같은 폴더에 , 또는 PATH 환경 변수에서). -Raw 인수가 당신을 위해 작동하지 않는 경우

$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" 
    } 
} 

, 당신은

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

당신이 질문이나 문제가있는 경우 알려줘 것을 해결할 수 있습니다.

+0

와우, 너희들 정말 근사하다. 나는 정말로 내 기술을 다음 단계로 가져 가고 싶다. 당신 같은 사람들이 전화에 응답하지 않으면 이러한 자원없이 나는 완전히 잃어 버릴 것이다. –

+0

내가 이걸 실행할 때 다음 오류가 발생했습니다 ... & ICAcls 문자열 형식화 오류 : 인덱스가 0보다 크고 인수 목록의 크기보다 작아야합니다. 줄에 21 문자 : 146 + ... 전자 -eq은 '허용') { '그랜트한다} else + ~~~~~~~ + CategoryInfo) {'거부 '} InvalidOperation ("{0}"/{4} "{1} .../상속 : R : 문자열) [], RuntimeException을 + FullyQualifiedErrorId : FormatError이 –

+0

죄송합니다 ... –