Set-ADUser脚本自定义对象属性未被识别,无法跳过空值更新AD求助
问题:PowerShell脚本更新AD时跳过属性循环导致无法更新
我正在编写每半小时运行一次的PowerShell脚本,从HR系统拉取CSV文件更新Active Directory(AD)记录。CSV列名与AD属性名不匹配,所以我创建了自定义对象映射对应属性,同时需要跳过CSV中的空值列(无法提前知晓哪些列是空的,不同文件情况不同)。
当前脚本未报错,但处理自定义对象属性的ForEach循环直接跳过,导致$setSplat为空,无法执行Set-ADUser更新操作。
我的代码
$ADObjectToUpdate = [PSCustomobject]@{ GivenName = $CSVUserData.FirstName Surname = $CSVUserData.LastName Description = $DescriptionString Title =$CSVUserData.JobTitle Department = $CSVUserData.Department Manager = $ADManager # 这是一个AD对象 Company = $CSVUserData.Company EmployeeID = $CSVUserData.EmployeeNumber StreetAddress = $CSVUserData.WorkAddress City = $CSVUserData.City State = $CSVUserData.State PostalCode = $CSVUserData.Zip Country = $CSVUserData.Country Office = $CSVUserData.Location LogonWorkstations = $CSVUserData.WorkstationLocation EmailAddress = $CSVUserData.EmailAddress } $setSplat = @{} ForEach($_ in $ADObjectToUpdate.PSObject.Properties) { If(-not([string]::IsnullOrWhiteSpace($_.Value))) { $setSplat[$_.Name] = $_.Value } } Set-ADUser -Identity $CurrentADUser @setSplat
问题分析
核心问题是空值判断逻辑不兼容非字符串类型的属性:
[string]::IsNullOrWhiteSpace()仅适用于字符串类型,当遇到Manager这种AD对象(非字符串)时,该方法会将其转换为字符串后判断,若AD对象的字符串表示为空(或转换失败),就会被错误过滤。- 部分属性的空值可能是
$null而非空白字符串,原判断逻辑也无法正确识别。
解决方案
修改空值判断逻辑,区分字符串与非字符串类型:
$setSplat = @{} ForEach($_ in $ADObjectToUpdate.PSObject.Properties) { # 处理字符串类型属性,过滤空白/空字符串 if ($_.Value -is [string]) { if (-not [string]::IsNullOrWhiteSpace($_.Value)) { $setSplat[$_.Name] = $_.Value } } # 处理非字符串类型,仅过滤$null值 else { if ($_.Value -ne $null) { $setSplat[$_.Name] = $_.Value } } }
调试建议
可以先输出自定义对象的属性详情,确认属性是否正确创建:
# 输出所有属性的名称、值和类型,用于调试 $ADObjectToUpdate.PSObject.Properties | Select-Object Name, Value, @{Name='ValueType'; Expression={$_.Value.GetType().Name}}
内容的提问来源于stack exchange,提问作者RobinOlsen
相关产品推荐
相关产品推荐

