对比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
相关产品推荐
相关产品推荐

