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

时间:2016-08-27 16:31:00

标签: excel powershell csv permissions

我试图让它更容易在文件服务器上使用。我想导入一个名为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

等等。

我想创建输出到: 使用文件夹名称和共享名称作为文件名的一部分将数据输出到\\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
}

1 个答案:

答案 0 :(得分:1)

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

  • 循环路径
  • 获取每个文件夹的ACL
  • 扩展ACE
  • 选择要导出的ACE属性
  • 使用calculated property
  • 添加路径
  • 将所选属性导出为CSV

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

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进行模拟。