我有一个PS脚本,如果分配了一个用户,它将返回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"
答案 0 :(得分:2)
您通常可以使用的一个选项是使用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的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
答案 1 :(得分:0)
简单的方法是使用" \\?"支持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),并添加" \\?\"走的路。
答案 2 :(得分:0)
好的,这个问题已经很老了,但对于像我这样今天来到这里的人,我提供了通过Google找到的这些信息:
Microsoft Technet脚本中心列出了一个“File System Security PowerShell Module”,声称从版本3.0开始,它“利用AlphaFS(http://alphafs.codeplex.com)解决MAX_PATH限制为260个字符 ”。在撰写本文时,该模块的版本为4.2.3。
此模块的一般概念被描述为“PowerShell仅提供Get-Acl和Set-Acl,但是在获取和设置ACL之间的所有内容都缺失。此模块缩小了差距。” 所以没有自己试过这个,我想它应该有助于解决OP问题。
该模块还包含在“Hey, Scripting Guy! Blog”的帖子中。