0

Dieser stempelt mich. Ich versuche, dies mit PowerShell zu tun, aber es muss nicht sein ...Re-acl von der Textdatei

Grundsätzlich habe ich eine Textdatei mit ACLs Informationen für eine große Verzeichnisstruktur, die migriert wurde (ich weiß, es gibt viel zu sein gewünscht aus dem Inhalt, aber wir können nicht mehr auf das ursprüngliche Dateisystem zugreifen, also müssen wir damit arbeiten).

Ich muss eine Batch-Datei generieren, um das neue (kopierte) Dateisystem zu reaklieren.

Also kurz gesagt, ich brauche Text so zu konvertieren (sorry für die Schriftrolle, aber ich versuche, den Zeilenabstand zu erhalten):

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 

In neuen Dateien (oder die gleichen Dateien, doesn ‚t Angelegenheit wirklich) mit dem Inhalt wie folgt aus:

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 

Mein halb pathetischen Versuch, diese zu erarbeiten voran noch, aber ich merke, dass dieser Feind ist größer als mein mojo:

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

Ich merke, dass es hier eine Menge Arbeit gibt & Ich fange gerade an, das herauszufinden. Zum Beispiel denke ich, ich muss die Berechtigungen in einem Array auflisten und die Zeichenfolge als solche erstellen. Es gibt auch spezielle Berechtigungen etc ...

Aber jetzt versuche ich herauszufinden, wie Sie die Textdatei importieren und dann in Variablen zerlegen ... Wie gesagt, ich arbeite in Powershell, aber es kann wirklich alles sein ... VB oder Python vielleicht?

Vielen Dank im Voraus!

+0

Ich denke, es könnte einen einfacheren Weg geben, dies zu tun. Sie können die Zugriffsrechte für eine Datei mit den GetAccessControls() -Methoden lesen. Probieren Sie es aus: '(ls foo.txt) .GetAccessControl()'. Wenn Sie gleichzeitig Zugriff auf beide Ordner haben, können Sie die Übertragung möglicherweise einfacher vornehmen. Es gibt auch eine 'SetAccessControl()' Methode, um sie zu setzen, dachte ich habe sie nie selbst benutzt. – n3wjack

+0

@ n3wjack _aber wir können nicht mehr auf das ursprüngliche Dateisystem zugreifen, _ – Matt

+0

Genau ...Was passierte, war, dass wir einige Skripte hatten, die das richtig machten, und ich schrieb dieses kleine Skript, um die AIs in einer für Menschen lesbaren Form auszugeben ... Einer meiner Mitarbeiter bat darum, es zu benutzen und ich wusste nicht, dass sie nicht die Original ... Ich habe es erst nach dem Cutover herausgefunden ... –

Antwort

1

Ok, ich denke das meiste deines Problems ist das Parsen des Textes, also ist das hauptsächlich was ich hier geholfen habe. Ich habe die Zeichenfolgen erstellt, und wenn Sie mehr Berechtigungen haben, die Sie einschließen möchten, sollten Sie in der Lage sein, herauszufinden, wie Sie sie zu der switch hinzufügen. Dazu wollen wir die gesamte Textdatei als großen mehrzeiligen String lesen. Dann teilen wir es in Stücke auf Basis des Schlüsselwortes "Pfad:" auf. Dann erhalte ich für jeden Datensatz den Pfad als String, erhalte die Berechtigungen und analysiere Accounts, erlaube/leugne und einzelne Zugriffe. Dann konvertiere ich die Zugriffe auf kurze Versionen, die von icacls akzeptiert werden, und baue die Argumente als formatierten String aus.

I-Ausgang an den Host, aber wenn Sie überzeugt sind, dass es dir gut aussieht, können Sie die Write-Host " und die Hinter " zu entfernen und es wird es nur icacls ausführen (vorausgesetzt, ist im selben Ordner, den Sie sind in oder in der PATH-Umgebungsvariablen).

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

Wenn das -Raw Argument nicht für Sie arbeiten, können Sie umgehen, dass mit

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

Lassen Sie mich wissen, wenn Sie Fragen oder Probleme haben.

+0

Wow, ihr seid so großartig. Ich möchte wirklich meine Fähigkeiten auf die nächste Ebene bringen und ohne diese Ressourcen wäre ich völlig verloren, wenn Leute wie du den Anruf nicht annehmen würden. –

+0

Wenn ich das ausgeführt habe, bekam ich den folgenden Fehler ... & ICAcls Fehler beim Formatieren einer Zeichenfolge: Index (Null basiert) muss größer oder gleich Null und kleiner als die Größe der Argumentliste sein. At line 'zulassen') { 'Grant} else { 'Verweigern'} 146 + ... e eq) + ~~~~~~~ + CategoryInfo:: 21 char InvalidOperation: ("{0}"/{4} „{1} .../Vererbung: r: String) [], Runtime + FullyQualifiedErrorId: FormatError –

+0

Sorry, versuchen, das aber zu spät ... –