我正在编写一个 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
就解决了我的问题。