Powershell:NTFS权限和父文件夹-pathtoolong问题

时间:2016-02-18 17:26:32

标签: powershell inheritance permissions ntfs

我在长篇文章之前道歉。我花了很多时间试图找到答案或拼凑出这个问题的解决方案。

这是一个简单的请求:向整个DFS环境添加一组具有两组权限的用户/组,将一组应用于文件夹和子文件夹,另一组仅应用于文件。< / p>

似乎很容易,但在我试图管理的环境中,我们有超过260个字符的1000个文件夹路径,任何使用dir -recurse或get-childitem都会导致命中错误&#34; pathtoolong&#34; 。针对此问题的每个示例解决方案都使用了上述的变体或依赖于&#34; get-childitem&#34;。这对于大多数现实世界的情况都是失败的,因为我相信由于DFS使用的性质,我们许多IT管理员都面临着漫长的道路。

当前的尝试: 目前我正在使用自定义模块&#34; NTFSSecurity&#34;这是非常棒的应用NTFS权限。它很棒! 可在此处找到:https://ntfssecurity.codeplex.com/

来自此处的教程:https://blogs.technet.microsoft.com/fieldcoding/2014/12/05/ntfssecurity-tutorial-1-getting-adding-and-removing-permissions/

在上面的教程中找到的问题以及我能够找到的所有其他示例中,它引用了以下命令:

dir -Recurse | Get-NTFSAccess -Account $account 

这将在超长文件路径的现实世界中失败。

&#34; PathTooLong&#34;错误解决方法:

我的解决方法当前包括使用Robocopy将文件路径导出到文本文件。我发现这是处理类似问题的人的推荐。 Robocopy不会在&#34; pathtoolong&#34;问题,非常适合这项工作。然后我尝试对包含我需要修改的所有路径的文本文件运行命令。

Robocopy的命令是:

robocopy '<insert source path here>' NULL /NJH /E /COPYALL /XF *.* | Out-File -FilePath '<path to fileout.txt>'

这将创建一个文本文件,同时只复制文件夹结构和权限。优良!

然后,您必须使用我使用的其他字符清理文本文件:

$filepath = '<path>\DFS_Folder_Structure.txt'
$structure = Get-Content $filepath
$structure -replace '     New Dir          0    '| Out-File -FilePath \\<path_you_want_file>\DFS_Folder_Structure2.txt

我还反转了文本文件的内容,以便显示最远的子对象(文件夹)并减少工作量。我认为这可能更容易识别父文件夹或其他一些我无法弄清楚的递归逻辑。

要从下到上反转文本,请在此处使用此命令:

$x = Get-Content -Path 'C:\temp_dfs\DFS_Folder_Structure2.txt'; Set-Content -Path 'C:\temp_dfs\Reversed_data.txt' -Value ($x[($x.Length-1)..0])

此脚本当前仅适用于具有继承关闭的路径或具有继承关闭的子对象。这取自NTFSSecurity模块命令Get-NTFSInheritance,它将返回AccessInheritance和AuditInheritance的结果。如果文件夹是从上面的父级继承,则访问。审核是文件夹是否将其传递给子对象。 有四种可能性:

AccessInheritance True AuditInheritance True

AccessInheritance True AuditInheritance False

AccessInheritance False AuditInheritance True

AccessInheritance False AuditInheritance False

(*特别说明:我已经看到所有4个出现在我正在处理的DFS结构中。)

根据文本文件中包含的文件路径设置权限的脚本:

#Get File content to evaluate
$path = Get-Content 'C:\temp_dfs\Reversed_data.txt'
$ADaccount = '<insert fully qualified domain\user or group etc.>'

Foreach ($line in $path)
    {
        #Get-NTFSAccess -Path $line -Account $ADaccount | Remove-NTFSAccess
        #This command will find the access of an account and then remove it.
        #It has been omitted but included in case needed later.

    $result = Get-NTFSInheritance -Path $line

    If ($result.AccessInheritanceEnabled -Match "False" -and $result.AuditInheritanceEnabled -match "False") 
    {
        Add-NTFSAccess -Path $line -Account $ADaccount -AccessRights Traverse,ExecuteFile,ListDirectory,ReadData,ReadAttributes,ReadExtendedAttributes,ReadPermissions -AppliesTo ThisFolderAndSubfolders
        Add-NTFSAccess -Path $line -Account $ADaccount -AccessRights ReadAttributes,ReadExtendedAttributes,ReadPermissions -AppliesTo FilesOnly
    }

    If ($result.AccessInheritanceEnabled -Match "False" -and $result.AuditInheritanceEnabled -Match "True")
    {
        Add-NTFSAccess -Path $line -Account $ADaccount -AccessRights Traverse,ExecuteFile,ListDirectory,ReadData,ReadAttributes,ReadExtendedAttributes,ReadPermissions -AppliesTo ThisFolderAndSubfolders
        Add-NTFSAccess -Path $line -Account $ADaccount -AccessRights ReadAttributes,ReadExtendedAttributes,ReadPermissions -AppliesTo FilesOnly 
    }

    If ($result.AccessInheritanceEnabled -Match "True" -and $result.AuditInheritanceEnabled -Match "False")
    {
    continue
    }

    If ($result.AccessInheritanceEnabled -Match "True" -and $result.AuditInheritanceEnabled -Match "True")
    {
    continue 
    }

}

此脚本将应用指定用户/组帐户的权限,并设置文件夹和子文件夹的权限,然后仅向“文件”添加另一组权限。

现在这个当前的修复工作很有效,只是它只触及关闭了继承的文件夹。这意味着您需要运行此脚本,然后在&#34;主要父文件夹&#34;上设置权限。这是完全可行的,可能是避免双重权限输入的最佳方法,也是我的解决方案的当前状态。

如果您向AccessInheritanceEnable = True和Audit = True的底部添加条件,您将获得双重条目,因为您正在同时对父级&gt;应用权限。它将其权限推送到子对象,并明确地在子对象本身上。这是由于文本文件包含父和子,我还没有找到解决这个问题的方法。这不是很可怕&#34;但是如果可以避免的话,我的强迫症并不想增加双重权限。

真正的问题: 我真正想做的是以某种方式识别父文件夹,将它们与树上的父母进行比较,看看它是否是继承权限,只将权限集应用于最高父权。特定的链。我的想法是想要思考你如何比较父母并找到最高的父母&#34;。

同样问题是,只要你想要解决文件夹结构,它就会因为&#34; pathtoolong&#34;而失败。因此需要将其包含在应用于文本文件路径的逻辑中。我已经看到了一些关于分离路径的提及,但我并不真正理解应用的方式或者如何在确定父路径之前将路径与另一条路径进行比较。

感谢您花时间阅读这篇长篇文章和问题。如果您现在仍然醒着,我可以接受任何建议。大声笑。

1 个答案:

答案 0 :(得分:0)

NTFSSecurity模块确实太棒了。 我用它来创建一个脚本,可以将UNC路径的ntfs安全性和它的子文件夹导出到可读的excel文件中。

可在以下位置找到: https://github.com/tgoetheyn/Export-NtfsSecurity

我经常使用,并且长文件名没有任何问题。 希望你喜欢它。

PS:如果添加ntfssecurity,请不要忘记包含“同步”权限。如果不包括在内,可能会发生奇怪的事情。