You need to enable JavaScript to run this app. AD单用户密码过期邮件通知配置:PowerShell报字符串终止符错误
优惠活动
大模型
产品
解决方案
定价
更多

AD单用户密码过期邮件通知配置:PowerShell报字符串终止符错误

脚本解析报错修复方案

报错直接成因

PowerShell在解析到-body参数对应的字符串行时,因为多行命令的续行规则不严谨、加上可能混入的全角引号字符,判定双引号没有正确闭合,直接触发字符串终止符缺失的解析错误,不会进入实际执行阶段。

分步修复操作

  • 重构Send-MailMessage的多行参数写法,避免续行符不匹配的问题:
    原代码的错误写法存在两个典型问题:一是最后一行body参数作为多行命令的组成部分,没有和上一行的续行规则形成闭环;二是嵌套了变量的长字符串直接放在参数位置,容易因为引号转义问题触发解析错误。
    替换为更稳妥的写法:
    foreach ($user in $users) {
        # 先单独定义邮件内容、主题变量,规避字符串解析问题
        $mailSubject = "Your password will expire in $($user.DaysToExpiry) days"
        $mailBody = "Your password will expire at $($user.ExpiryDate) (India Standard Time)"
        
        Send-MailMessage `
            -From "it@specopsdemo1.com" `
            -SmtpServer smtp-server.domain.com `
            -To $user.Mail `
            -Subject $mailSubject `
            -Body $mailBody
    }
    
  • 修复脚本内其他隐藏的语法硬伤,避免修改完字符串问题后继续报其他错误:
    • 原Get-ADUser命令行的–Server参数前是全角长破折号,需替换为半角短横-,否则PowerShell无法识别参数标识
    • 原ExpiryDate计算逻辑没有做时区转换:目前转换得到的是UTC时间,和邮件正文标注的"India Standard Time"不匹配,需补充时区转换逻辑:
      @{Name="ExpiryDate";Expression={
          $utcExpiry = [datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")
          # 转换为印度标准时间
          [TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($utcExpiry, "India Standard Time")
      }}
      
    • 原DaysToExpiry的计算逻辑直接用FileTime数值除以常量,容易因为时间精度偏差导致天数统计错误,替换为基于时间对象的差值计算:
      @{Name="DaysToExpiry";Expression={
          $utcExpiry = [datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")
          [int]($utcExpiry - (Get-Date).ToUniversalTime()).TotalDays
      }}
      
  • 修改完成后,先执行语法校验:在PowerShell中运行脚本的语法检查指令[System.Management.Automation.PSParser]::Tokenize((Get-Content .\notification.ps1 -Raw), [ref]$null),确认没有解析类报错后再正式执行脚本。

内容的提问来源于stack exchange,提问作者user4948798

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 15:45:11