网络驱动器文件夹ACL提取脚本故障排查与优化
修复网络驱动器文件夹ACL提取脚本问题
原需求是编写PowerShell脚本提取网络驱动器所有文件夹的ACL,列出文件路径、对应的安全组及组内用户。但当前脚本运行存在以下问题:
- 单一路径返回多条重复结果,疑似循环或输出逻辑错误
- 无法过滤Domain Users、Administrators等默认组,无法仅提取受限访问的安全组
- 运行时会错误提取Domain Users组的用户,且仅处理到路径的最后一个文件夹
原脚本问题根源
- 仅保留最后一个文件夹的ACL:第一个
ForEach循环中,$ACLObjects变量每次都会被覆盖,最终只存储最后一个文件夹的ACL对象,导致后续仅处理该文件夹。 - 过滤逻辑错误:原脚本在获取组成员后尝试过滤,但
Get-ADGroupMember的结果不存在identityreference属性,且组名字符串大小写不匹配(如"domain users"与实际AD组名"Domain Users"不一致),应该先过滤ACL条目里的默认组,再去获取成员。 - 文件夹路径变量失效:第二个循环中使用的
$folder.FullName是第一个循环结束后的最后一个值,导致所有输出都显示同一文件夹路径,出现重复结果。
修复后的脚本
# 起始文件夹路径,替换为实际网络驱动器路径 $startpoint = "<filepath here>" # 获取起始路径下的所有子文件夹(需包含嵌套文件夹可添加 -Recurse 参数) $folders = Get-ChildItem -Path $startpoint -Directory | Select-Object -ExpandProperty FullName # 定义需要排除的默认组(注意匹配实际AD组名的大小写和格式) $excludedGroups = @( "BUILTIN\Administrators", "BUILTIN\Users", "NT AUTHORITY\SYSTEM", "YOURDOMAIN\Domain Users" # 替换为你的域名+Domain Users组名 ) # 遍历每个文件夹处理ACL foreach ($folderPath in $folders) { Write-Host "=============================" Write-Host "文件夹路径: $folderPath" Write-Host "=============================" # 获取当前文件夹的ACL $acl = Get-Acl -Path $folderPath # 遍历ACL中的访问控制条目 foreach ($accessEntry in $acl.Access) { $identity = $accessEntry.IdentityReference.ToString() # 跳过排除列表中的默认组 if ($excludedGroups -contains $identity) { continue } # 提取组名(兼容域组和本地组格式) $groupName = if ($identity -match "\\") { $identity.Split("\")[1] } else { $identity } Write-Host "`n安全组名称: $groupName" Write-Host "权限类型: $($accessEntry.AccessControlType)" Write-Host "文件系统权限: $($accessEntry.FileSystemRights)" Write-Host "组内用户列表:" try { # 递归获取组内成员,仅提取用户对象(排除嵌套组) Get-ADGroupMember -Identity $groupName -Recursive | Where-Object { $_.ObjectClass -eq "user" } | Select-Object -ExpandProperty Name } catch { Write-Host "无法获取组成员: $_" } Write-Host "-----------------------------" } }
修复说明
- 存储所有文件夹路径到
$folders,避免变量被覆盖,确保遍历所有目标文件夹 - 提前定义排除组列表,在处理ACL条目时直接跳过,减少无效的组成员查询
- 修正文件夹路径引用,使用当前循环的
$folderPath,确保输出与实际处理的文件夹对应 - 添加异常处理,避免因组不存在或权限不足导致脚本中断
- 过滤
Get-ADGroupMember结果,仅提取用户对象,排除嵌套组干扰
内容的提问来源于stack exchange,提问作者NobleMoose
相关产品推荐
相关产品推荐

