计划 powershell 脚本任务不发送邮件消息

计划 powershell 脚本任务不发送邮件消息

我正在编写一个 Powershell 脚本来创建公司同步的电子邮件签名,这样当信息发生变化时,我就不必要求用户手动编辑他们的签名。它被设置为抓取共享网络驱动器中的签名模板文件的内容,并将其与位于每台机器本地的个人签名相结合。

我的想法是运行一项计划任务,以便在模板发生任何潜在变化后不迟于 24 小时内更新这些内容。

如果脚本失败,它会写入日志并最终通过电子邮件发送给我,以便我可以立即根据每个用户解决任何问题。

假设我手动运行该脚本,那么该脚本可以完美运行。如果我在用户上下文中将其作为计划任务运行(仍然是我),它不会发送电子邮件通知。

我将链接脚本,但是在 Send-MailMessage 方面,计划任务是否会导致其行为有所不同?

我的环境是在 Windows 7 客户端上运行的 Server 2008r2 域。

    ##############################################
    #Script to automatically sync email signatures
    ##############################################

    #Get logged in user - e.g. DOMAIN\user
    $user = $(Get-WMIObject -class Win32_ComputerSystem | select username).username
    #Strip off DOMAIN\
    $user = $user.Substring(8)

    #Define local and network file paths
    $templatePath = "\\files\z\Email Signatures"
    $localPath = "C:\Signature"

    #Grab date last modified for signature template file
    $signatureTemplate = Get-Item -LiteralPath "$templatePath\signature.html"
    $templateLastMod = $signatureTemplate.lastWriteTime.toString("yyyyMMddHHmmss") -as [int64]

    #Grab date last modified for user's current signature
    If((Test-Path "$localPath\$user-signature.html") -eq $true){
        $currentSig = Get-Item -LiteralPath "$localpath\$user-signature.html"
        $currentSigLastMod = $currentSig.lastWriteTime.toString("yyyyMMddHHmmss") -as [int64]
    }
    Else{
        $currentSigLastMod = 00000000
    }

    #If template is newer than signature, generate updated signature
    If ($currentSigLastMod -lt $templateLastMod) {

        $sigPath = "$localPath\$user-signature.html"
        $userInfo = "$localPath\$user.html"

        #If user info doesn't exists, end script
        If ((Test-Path $userInfo) -eq $false) {
            $errorTime = (Get-Date)
            Add-Content "$templatePath\userlog.txt" "$errorTime -- $user.html file for user $user does not exist.  Unable to sync signature file."

            #Set SMTP capable user to send email notification
            $smtpUser = "domain\smtpuser"
            $PWord = ConvertTo-SecureString -String "password" -AsPlainText -Force
            $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $smtpUser, $PWord

            $emailSmtpServer = "mail.domain.com"
            $emailFrom = "[email protected]"
            $emailTo = "[email protected]"
            $emailSubject = "Missing personal info: $user"
            $emailBody = "$errorTime -- $user.html file for user $user does not exist.  Unable to sync signature file."

            Send-MailMessage -SmtpServer $emailSmtpServer -Credential $Credential -From $emailFrom -To $emailTo -Subject $emailSubject -Body $emailBody  

            return 
        }
        Else{
            #If current signature already exists, delete it.
            If ((Test-Path $sigPath) -eq $true) {
                Remove-Item -LiteralPath $sigPath
            }
        }

        #Create new signature for user
        New-Item -Path "$localPath" -name "$user-signature.html" -itemtype file 

        #Concatenate template content and user personal info into new signature
        Add-Content "$localPath\$user-signature.html" (Get-Content $signatureTemplate)
        Add-Content "$localPath\$user-signature.html" (Get-Content $userInfo)

    }
    Else {
        return
    }

答案1

我找到了一个解决方案,只需添加 Start-Sleep -Seconds 1最后一行,它就对我有用。

答案2

可以确认添加Start-Sleep -Seconds 1到我的脚本中也解决了我的问题。今天我一直在为这个问题绞尽脑汁几个小时。我尝试了通常的方法:

  • 安装了最新的 Windows 管理框架 5.1
  • 已禁用防火墙
  • Nslookup / ping 正在向该域发起请求
  • 一些 Windows 7 / 2008 实例正在运行,但有些由于未知原因无法运行。
  • Windows 10 客户端使用相同的 powershell 脚本/网络没有问题

Start-sleep -Seconds 1在我的前面加上一个Send-Mailmessage就解决了我的问题。

相关内容