使用sAMAccountName向AD导入办公电话的PowerShell脚本运行报错如何解决
问题根源
你的代码存在3处变量使用错误,导致传递给Get-ADUser的Identity参数为空,触发报错:
- 循环迭代变量被覆盖:你定义的循环结构是
ForEach($User in $UserList),每次迭代的当前CSV行数据存储在$User变量中,但循环内部你又重新给$User赋值,直接覆盖了原始的CSV行数据 - 调用了未定义的变量:循环内部使用的
$U从未被赋值,$U.SamAccountName和$U.OfficeNumber的取值全部为空 - 取值逻辑错误:你尝试把
$U.SamAccountName赋值给$User后,后续调用$user.SamAccountName相当于去字符串类型的账号值里找SamAccountName属性,必然返回空值
修复后代码
# 导入AD模块 Import-Module ActiveDirectory -ErrorAction Stop # 导入CSV文件,注意确认CSV分隔符、列名和实际情况一致 $UserList = Import-Csv -Delimiter ';' -Path C:\PhoneNumber.csv # 遍历CSV每一行 ForEach($Row in $UserList){ # 读取当前行的字段值 $SamAccountName = $Row.SamAccountName $OfficePhone = $Row.OfficeNumber # 过滤空值行,避免无效报错 if(-not [string]::IsNullOrWhiteSpace($SamAccountName) -and -not [string]::IsNullOrWhiteSpace($OfficePhone)){ try { Get-ADUser -Identity $SamAccountName | Set-ADuser -OfficePhone $OfficePhone -ErrorAction Stop Write-Host "用户 $SamAccountName 办公电话更新成功,新号码:$OfficePhone" } catch { Write-Warning "用户 $SamAccountName 更新失败:$_" } } else { Write-Warning "当前行存在空值,跳过处理:SamAccountName=$SamAccountName, OfficeNumber=$OfficePhone" } }
注意事项
- 运行前先打开CSV文件确认列名是否和代码中完全一致,拼写不能出错
- 确认CSV的分隔符确实是分号,如果你导出CSV用的是逗号分隔,要把
-Delimiter ';'改成-Delimiter ',' - 运行脚本的账号需要拥有AD用户属性的修改权限
内容的提问来源于stack exchange,提问作者gm13
相关产品推荐
相关产品推荐

