You need to enable JavaScript to run this app. 对比CSV与Active Directory用户、导出用户组隶属的PowerShell脚本括号报错求助
优惠活动
大模型
产品
解决方案
定价
更多

对比CSV与Active Directory用户、导出用户组隶属的PowerShell脚本括号报错求助

脚本语法错误排查与修正方案

原脚本核心问题

  • Get-ADUser的LDAP过滤参数混入HTML转义字符("/&),PowerShell无法识别,会直接触发参数解析失败
  • 括号配对完全错位,触发语法报错:foreach循环块内的if判断结构错误,将右括号写在判断条件外侧,形成if (条件 }) {的非法语法
  • 基础逻辑偏差:
    • 姓名字段赋值错误,Surname字段错误读取GivenName的取值
    • 未定义变量$NotinAD就直接引用,且判断逻辑反向:本应标记AD存在状态的字段,代码逻辑里匹配到AD值后反而赋值为不存在状态
    • 未将AD用户的MemberOf(组隶属)属性加入Get-ADUser的-Properties参数,无法获取组归属信息
    • 未建立CSV员工与对应AD用户的对象级关联,仅判断ID是否存在于数组中,无法提取匹配用户的组数据
  • 哈希表初始化时错误引用CSV行不存在的MemberOf字段作为初始值

修正后的可运行脚本

# 导入CSV格式员工列表
$csvEmployees = Import-Csv -Path "C:\IT\list.csv"

# 获取AD中已启用的用户对象,补充需要的属性(包含组隶属关系)
$adUsers = Get-ADUser -LdapFilter "(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2))" -Properties EmployeeID,GivenName,Surname,MemberOf

# 遍历CSV列表匹配AD用户,生成结果集
$csvEmployeesInAd = $csvEmployees.foreach({
    $currentRow = $_
    # 通过员工ID精准匹配对应的AD用户
    $matchedAdUser = $adUsers | Where-Object { $_.EmployeeID -eq $currentRow.EmployeeID }

    [pscustomobject]@{
        EmployeeID = $currentRow.EmployeeID
        GivenName = $currentRow.GivenName
        Surname = $currentRow.Surname
        IsMatchedInAD = [bool]$matchedAdUser
        ADGroupMembership = if ($matchedAdUser) { $matchedAdUser.MemberOf } else { $null }
    }
})

# 将最终结果导出为CSV文件
$csvEmployeesInAd | Export-Csv -Path "C:\IT\EmployeeADCompareResult.csv" -NoTypeInformation -Encoding UTF8

关键修正说明

  • 移除LDAP过滤器中的HTML转义字符,使用PowerShell可正常解析的原生过滤语法
  • 调整所有代码块的括号配对,完全修正foreach循环、条件判断的结构错误
  • 修正姓名字段取值逻辑,Surname从CSV对应字段正确读取
  • 建立员工ID维度的AD用户对象关联,而非单纯判断值是否存在于数组,可直接提取匹配用户的组隶属数据
  • 补充获取AD用户MemberOf属性的配置,满足组清单输出需求
  • 修正AD匹配状态的标记逻辑,匹配到AD用户时才填充对应组信息
  • 新增结果导出逻辑,直接将完整比对清单存为本地CSV文件

内容的提问来源于stack exchange,提问作者user2.0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 03:36:06