You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网络驱动器文件夹ACL提取脚本故障排查与优化

修复网络驱动器文件夹ACL提取脚本问题

原需求是编写PowerShell脚本提取网络驱动器所有文件夹的ACL,列出文件路径、对应的安全组及组内用户。但当前脚本运行存在以下问题:

  • 单一路径返回多条重复结果,疑似循环或输出逻辑错误
  • 无法过滤Domain Users、Administrators等默认组,无法仅提取受限访问的安全组
  • 运行时会错误提取Domain Users组的用户,且仅处理到路径的最后一个文件夹

原脚本问题根源

  1. 仅保留最后一个文件夹的ACL:第一个ForEach循环中,$ACLObjects变量每次都会被覆盖,最终只存储最后一个文件夹的ACL对象,导致后续仅处理该文件夹。
  2. 过滤逻辑错误:原脚本在获取组成员后尝试过滤,但Get-ADGroupMember的结果不存在identityreference属性,且组名字符串大小写不匹配(如"domain users"与实际AD组名"Domain Users"不一致),应该先过滤ACL条目里的默认组,再去获取成员。
  3. 文件夹路径变量失效:第二个循环中使用的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:30:56