优化AD属性更新PowerShell脚本及解决空字段问题
优化Active Directory属性更新的PowerShell脚本
原脚本存在两个问题:CSV空字段会触发报错、空字段无法清空AD中的现有属性值,同时多次循环查询AD导致效率低下。以下是针对性的优化方案:
优化后的完整脚本
Import-Module ActiveDirectory # 导入CSV数据并定义AD搜索路径 $users = Import-Csv -Path "C:\sdk\employees to update.csv" $searchBase = "OU=Staff Win10,dc=FAKEcompany,dc=on,dc=ca" foreach ($user in $users) { # 跳过员工号为空的无效条目 if ([string]::IsNullOrWhiteSpace($user.EMPLOYEE)) { Write-Warning "跳过员工号为空的条目: $($user | Out-String)" continue } # 仅查询一次AD用户,避免重复请求提升效率 $adUser = Get-ADUser -Filter "FAKEcompanyEmployeeNumber -eq '$($user.EMPLOYEE)'" -Properties givenName, sn, FAKEcompanyEmployeeNumber, middleName -SearchBase $searchBase if (-not $adUser) { Write-Warning "未找到员工号为 $($user.EMPLOYEE) 的AD用户" continue } # 构建属性更新参数哈希表 $updateParams = @{} # 处理givenName(名) if ([string]::IsNullOrWhiteSpace($user.Emp_First_Name)) { $updateParams["Clear"] += "givenName" } else { $updateParams["Replace"] += @{"givenName" = $user.Emp_First_Name } } # 处理sn(姓) if ([string]::IsNullOrWhiteSpace($user.Emp_Last_Name)) { $updateParams["Clear"] += "sn" } else { $updateParams["Replace"] += @{"sn" = $user.Emp_Last_Name } } # 处理FAKEcompanyEmployeeNumber(员工号) if ([string]::IsNullOrWhiteSpace($user.Employee)) { $updateParams["Clear"] += "FAKEcompanyEmployeeNumber" } else { $updateParams["Replace"] += @{"FAKEcompanyEmployeeNumber" = $user.Employee } } # 处理middleName(中间名) if ([string]::IsNullOrWhiteSpace($user.Middle_Name)) { $updateParams["Clear"] += "middleName" } else { $updateParams["Replace"] += @{"middleName" = $user.Middle_Name } } # 存在更新参数时才执行修改操作 if ($updateParams.Count -gt 0) { $adUser | Set-ADUser @updateParams Write-Host "已完成员工号 $($user.EMPLOYEE) 的属性更新" } }
核心优化点说明
- 效率提升:每个用户仅执行一次
Get-ADUser查询,避免原脚本中每个属性单独循环查询的冗余操作,减少AD服务器的请求负载。 - 空字段报错处理:通过
[string]::IsNullOrWhiteSpace()判断字段有效性,提前跳过无效条目,避免空值引发的查询或设置错误。 - 空字段清空属性:CSV字段为空时,使用
-Clear参数清空AD中对应属性的现有值;字段有值时用-Replace更新,解决空字段无法覆盖现有数据的问题。 - 异常校验:增加用户不存在的判断并输出警告,避免无意义的修改操作。
内容的提问来源于stack exchange,提问作者lakeek
相关产品推荐
相关产品推荐

