获取长路径名上的文件夹 NTFS ACL

Get Folder NTFS ACL on long path name

我有一个 PS 脚本,如果分配了单个用户,它将 return NTFS ACL,在我找到超过 260 个字符的路径之前运行良好。我发现了很多关于路径太长问题和一些解决方法的信息,但我正在努力将解决方案集成到我的脚本中。有什么建议吗?

谢谢!

$DateStart = Get-Date  
$Path = "E:\"           
$PermittedOU1 = "OU=Groups,dc=chiba,dc=localt"
$PermittedOU3 = "OU=System Accounts,OU=Accounts,dc=chiba,dc=local"
$PermittedACL1 = get-adgroup -Filter * -SearchBase $PermittedOU1 
$PermittedACL3 = get-aduser  -Filter * -SearchBase $PermittedOU3
$ObjectPathItem = Get-ChildItem -path $Path -Recurse | where-object {$_.PsIsContainer} | foreach-    object -process { $_.FullName } 
$howmany=0  
$Logfilename = "C:\Users\administrator\Documents$(get-date -f yyyy-MM-dd-hh-mm).csv"


Add-Content $Logfilename "$DateStart`n"
$totalfolders=0
$i=0

ForEach ($Folder in $ObjectPathItem)
{
$totalfolders++
}



Foreach ($Folder in $ObjectPathItem)                                                
{                                                                            

   $ObjectACL = Get-ACL -Path $Folder                                            
   $i++
   $howmany=0 
   Write-Progress -id 1 -Activity "Folder Recursion" -status "Folders Traversed: "                 -PercentComplete (($i / $totalfolders) * 100)


   Foreach ($ACL in $ObjectACL.access)                                       
    {

        $ACLstring = $ACL.identityreference.Value                           
        $ACLstring = $ACLstring.Replace("CHIBA\","")                        
        if (($ACLstring -notin $PermittedACL1.name)`
        -and ($ACLstring -notin $PermittedACL3.SamAccountName)`
        -and ($ACLstring -notin "NT AUTHORITY\SYSTEM") `
        -and ($ACLstring -notin "BUILTIN\Administrators") `
        -and ($ACLstring -notin "CREATOR OWNER"))   
         {
                 $newline = "`"$Folder`"" + "," + "$ACLString"
                 Add-Content $Logfilename "$newline"   
                 $howmany+=1 
            }

        else {
                $howmany+=1
             }

    }


}
$DateEnd = Get-Date
Add-Content $Logfilename "`n`n$DateEnd"

您通常可以使用的一个选项是使用 New-PSDrive 创建映射驱动器。类似于:

Try{
    $ObjectACL = Get-ACL -Path $Folder
}
Catch{
    $SubPathLength = $Folder.FullName.substring(0,200).LastIndexOf('\')
    $NewTempPath = $Folder.FullName.SubString(0,$SubPathLength)
    New-PSDrive -Name Temp4ACL -Provider FileSystem -Root $NewTempPath
    $ObjectACL = Get-ACL "Temp4ACL:$($Folder.FullName.SubSTring($SubPathLength,$Folder.FullName.Length-$SubPathLength))"
}

这将找到路径中第 200 个字符之前的最后一个 \,获取完整路径的子字符串,直至该文件夹名称的末尾,并为其创建一个临时驱动器,然后获取 ACL基于临时驱动器和剩余路径。所以这个路径:

C:\Temp\Subfolder\Really Long Folder Name\Another Subfolder\ABCDEFGHIJKLMNOPQRSTUVWXYZ\We Are Really Pushing It Now\Im Running Out Of Folder Name Ideas\Hello My Name Is Inigo Montoya\You Killed My Father Prepare To Die\ReadMe.txt

在倒数第二个反斜杠处被截断。我最终会从以下位置获得 ACL:

Temp4ACL:\You Killed My Father Prepare To Die\ReadMe.txt

简单的方法是使用“\\?”支持 32,767 个字符。

$folder = "C:\MyFolder"
icacls "\?$folder"

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364963(v=vs.85).aspx

在此函数的 ANSI 版本中,名称限制为 MAX_PATH 个字符。要将此限制扩展到 32,767 个宽字符,请调用函数的 Unicode 版本 (GetFullPathNameW),并在路径前添加“\\?\”。

好吧,这个问题已经很老了,但是对于那些像我一样今天来到这里的人,我提供了我通过 Google:

找到的信息

Microsoft Technet 脚本中心列出了“File System Security PowerShell Module" which claims that since version 3.0 it "leverages the AlphaFS (http://alphafs.codeplex.com) 到 解决 260 个字符 MAX_PATH 限制的方法 ”。在撰写本文时,该模块的版本为 4.2.3。

本模块的总体思路描述为"PowerShell only offers Get-Acl and Set-Acl but everything in between getting and setting the ACL is missing. This module closes the gap." 所以我自己没有尝试过这个,我想它应该有助于解决 OPs 问题。

该模块还出现在“Hey, Scripting Guy! Blog”的 post 中。