2016-08-27 8 views
0

ファイルサーバーでの使用をより簡単にしようとしています。私はshares.txtと呼ばれるファイルをインポートしたいと思います。その中にはshares.txtがあります。フォルダ名→ルートフォルダと共有名→サブフォルダ。テキストファイルから共有リストのNTFSアクセス許可を読み取る方法

\\10.10.15.240\folder name\share name 
\\10.10.15.240\folder name\share2 name 
\\10.10.15.240\folder name\share3 name 

\\10.10.15.240\folder2 name\share name 
\\10.10.15.240\folder2 name\share2 name 
\\10.10.15.240\folder2 name\share3 name 

などとなる。

そして、私はへの出力を作成したいと思います:フォルダ名を使用して\\10.10.15.240\output\上のテキストファイルに 出力データを、ファイル名の一部として

\\10.10.15.240\output\Company_name_$folder name_$share name.csv 
\\10.10.15.240\output\Company_name_$folder name_$share2 name.csv 
\\10.10.15.240\output\Company_name_$folder name_$share3 name.csv 

\\10.10.15.240\output\Company_name_$folder2 name_$share name.csv 
\\10.10.15.240\output\Company_name_$folder2 name_$share2 name.csv 
\\10.10.15.240\output\Company_name_$folder2 name_$share3 name.csv 

を名前を共有し続けます。

スクリプトでこれをインポートする方法は分かりますか?私はいくつかのことを試しましたが、それらはすべてエラーを伴います。

スクリプト:

は、私が代わりにExcelに直接それを書くのCSVファイルへのアクセス権リストを書きたいです。

$ErrorActionPreference = "SilentlyContinue" 
$a = New-Object -ComObject Excel.Application 
$a.visible = $true 
$b = $a.Workbooks.Add() 
$intRow = 1 
$c = $b.Worksheets.Item(1) 
$c.Cells.Item($intRow,1) = "Folder" 
$c.Cells.Item($intRow,2) = "Compte/groupe" 
$c.Cells.Item($intRow,3) = "Type d'Acces" 
$c.Cells.Item($intRow,4) = "Droits" 
$d = $c.UsedRange 
$d.EntireColumn.AutoFit()|Out-Null 
$d.Interior.ColorIndex = 19 
$d.Font.ColorIndex = 11 
$d.Font.Bold = $true 
Remove-Variable arrayOfPath 
$depth = 2 
$RootFolder = "\\MySRV\Folder" 
for ($i=0; $i -le $depth; $i++) { 
    $arrayOfPath += ,$RootFolder 
    $RootFolder = $RootFolder + "\*" 
} 
$arrayOfPath | Get-ChildItem | %{ 
    Get-Acl $_.FullName 
} | %{ 
    $intRow = $intRow + 1 
    $c.Cells.Item($intRow, 1) = $_.Path.ToString().Replace("Microsoft.PowerShell.Core\FileSystem::", "") 
    $droit = $_.Access 
    $droit | %{ 
    $c.Cells.Item($intRow, 2) = $_.IdentityReference.ToString(); 
    $c.Cells.Item($intRow, 3) = $_.AccessControlType.ToString(); 
    $c.Cells.Item($intRow, 4) = $_.FileSystemRights.ToString(); 
    $intRow = $intRow+1 
    } 
} 
$d.EntireColumn.AutoFit() | Out-Null 

最終更新日:

$arrayOfPaths= Get-Content "\\UNC PATH\myfile.txt" 

Get-ChildItem $arrayOfPaths -Recurse | Where-Object {$_.mode -match "d"} | ForEach-Object { 
    $csv = $_.FullName -replace '^\\\\[^\\]+\\([^\\]+)\\(.*)', '\\UNC PATH\Company_name_${1}_${2}.csv' # <- construct CSV path here 
    $path = $_.FullName 
    Get-Acl $path | Select-Object -Expand Access | 
    Select-Object @{n='Path';e={$path}}, IdentityReference, AccessControlType, 
        FileSystemRights | 
    Export-Csv $csv -Append -NoType 
} 

答えて

1

は、基本的にはこのような何かしたい:パス

  • 各フォルダのACLを取得の上に

    • ループを拡張するACE
    • ACEプロパティを選択あなたはcalculated property
    • パスを追加し、エクスポートしたいIEは、ループ内で、出力CSV(複数可)への追加CSV

    に選択したプロパティをエクスポートするあなたは、各ACLがあるどのファイルに制御することができます輸出された。たとえば、ソースパスの要素、またはすでに書き込まれた要素の数(カウンタ変数を追加した場合)によってファイル名を変えることができます。 -AppendはPowerShellのV3にExport-Csvに追加されたこと

    Get-ChildItem $arrayOfPaths | ForEach-Object { 
        $csv = "..."   # <- construct CSV path here 
        $path = $_.FullName 
        Get-Acl $path | Select-Object -Expand Access | 
        Select-Object @{n='Path';e={$path}}, IdentityReference, AccessControlType, 
            FileSystemRights | 
        Export-Csv $csv -Append -NoType 
        } 
    } 
    

    注。以前のバージョンでは、ConvertTo-CsvAdd-Contentでエミュレートすることができます。

  • +0

    ありがとうございました。私の質問は、どのようにファイル名をソースパスの要素に依存させることができますか?私はそれが正規表現を必要と仮定2 - Get-Content経由で特定のTXTファイル内のすべてのフォルダのUNCパスを取得し、配列のエントリとしてそれぞれを返しますか?私はそれを理解することはできません。 – Arbelac

    +0

    正規表現は通常の方法です。または、パス文字列を分割することもできます。 'Get-Content'はすでに配列を返すので、変数に代入するか、直接Get-ChildItemにパイプすることができます。 –

    +0

    上記の最終更新コードは正しいですか?私のコードとあなたのコードをどのように組み合わせることができますか? Excelの使用をCOMオブジェクトとして完全に削除する必要がありますか?また、私が前に言ったように、正規表現や分割パス文字列をどうやって使うのですか? – Arbelac

    関連する問題