获取长路径名上的文件夹 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 中。
我有一个 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 中。