PowerShell中New-TimeSpan cmdlet迁移新服务器后报错求解决
AD密码过期脚本New-TimeSpan错误解决办法
问题根源
错误提示很明确:New-TimeSpan的-End参数需要DateTime类型的值,但你的$Expireson是一个TimeSpan类型(值为60.00:00:00,也就是60天的时间跨度),类型不匹配导致参数绑定失败。
这种情况大概率是脚本里错误地把域的MaxPasswordAge(密码最长有效期,本身是TimeSpan类型)直接当成了用户的密码过期时间,而正确的过期时间应该是用户最后改密码的时间(LastPasswordSet) + 域密码最长有效期,得到的是一个具体的DateTime值。
修正步骤
替换错误的$Expireson赋值逻辑
找到脚本里给$Expireson赋值的代码,替换成正确的计算方式:# 先获取当前域的密码最长有效期 $maxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge # 遍历AD用户时,逐个计算密码过期时间 foreach ($user in Get-ADUser -Filter * -Properties LastPasswordSet, PasswordNeverExpires) { # 跳过密码永不过期的用户 if ($user.PasswordNeverExpires) { continue } # 跳过未设置过密码的用户(LastPasswordSet为空) if (-not $user.LastPasswordSet) { continue } # 计算正确的过期日期(DateTime类型) $Expireson = $user.LastPasswordSet + $maxPasswordAge $today = Get-Date # 计算剩余过期天数 $timeSpan = New-TimeSpan -Start $today -End $Expireson $daystoexpire = $timeSpan.Days # 后续通知逻辑示例 if ($daystoexpire -le 7) { Write-Host "提醒:用户 $($user.Name) 的密码还有 $daystoexpire 天过期" } elseif ($daystoexpire -lt 0) { Write-Host "警告:用户 $($user.Name) 的密码已过期 $(-$daystoexpire) 天" } }处理边缘场景
- 跳过
PasswordNeverExpires为$true的用户,避免无效计算 - 跳过
LastPasswordSet为空的用户(比如新创建未设置密码的账号) - 单独处理
$daystoexpire为负数的情况(密码已过期)
- 跳过
验证变量类型
可以在脚本中临时添加一行输出,确认$Expireson的类型是否正确:Write-Host "Expireson类型:$($Expireson.GetType().Name),值:$Expireson"正常输出应该是
Expireson类型:DateTime,值:2024-XX-XX XX:XX:XX
常见错误排查
- 不要直接把
MaxPasswordAge赋值给$Expireson,它是时间跨度而非具体日期 - 确保
Get-ADUser命令通过-Properties指定了LastPasswordSet属性(默认不会返回该属性) - 多域环境下,确认
Get-ADDefaultDomainPasswordPolicy获取的是目标域的密码策略
内容的提问来源于stack exchange,提问作者jackusflackus
相关产品推荐
相关产品推荐

