0

これは私を困惑させています。PowerShell でこれを実行しようとしていますが、そうである必要はありません...

基本的に、移行された大規模なディレクトリ構造の 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

次のようなコンテンツを含む新しいファイル(または同じファイル、実際には問題ではありません)に:

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 でしょうか?

よろしくお願いします!

4

1 に答える 1

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"

質問や問題がある場合はお知らせください。

于 2016-08-05T21:51:55.547 に答える