如何从文本文件中读取共享列表中的NTFS权限

我试图让它更容易使用文件服务器上。 我想导入一个名为shares.txt的文件。 在那个shares.txt有例如行,例如文件夹名称→根文件夹和共享名称→子文件夹。

 \\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 

等等。

我想创build输出到:将数据输出到\\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 

并继续。

你知道如何在你的脚本中导入? 我尝试了几件事,但他们都出现了错误。

脚本:

我想将权限列表写入CSV文件,而不是直接写入Excel。

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

基本上你会做这样的事情:

  • 循环path
  • 获取每个文件夹的ACL
  • 扩展ACE
  • select您想要导出的ACE属性
  • 添加一个计算属性的path
  • 将选定的属性导出到CSV

在循环内附加输出CSV(s)允许您控制每个ACL导出到哪个文件。 例如,可以使文件名取决于源path的元素,或者已经写入的元素的数量(如果添加计数器variables)。

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

请注意, -Append已添加到PowerShell v3中的Export-Csv 。 在早期版本中,您可以使用ConvertTo-CsvAdd-Content来模拟它。