Email PowerShell脚本赢得';不要在ISE之外运行
我是全新的PowerShell,提前道歉。我从这里找到的脚本开始:(巨大的赞誉和感谢)并根据我的需要对它进行了调整。基本上,当这个错误代码发生时,它每60秒发布一次,所以我只希望每隔一段时间发送一封电子邮件,在一个基本表中将最近的20个事件转换为HTML。在ISE中执行脚本时,一切都很好,但是在常规PowerShell控制台中运行或作为计划任务运行时,不会发送电子邮件。需要注意的是,我可以在PowerShell控制台中运行电子邮件部分的所有内容,并将其写入HTML文件Email PowerShell脚本赢得';不要在ISE之外运行,email,powershell,Email,Powershell,我是全新的PowerShell,提前道歉。我从这里找到的脚本开始:(巨大的赞誉和感谢)并根据我的需要对它进行了调整。基本上,当这个错误代码发生时,它每60秒发布一次,所以我只希望每隔一段时间发送一封电子邮件,在一个基本表中将最近的20个事件转换为HTML。在ISE中执行脚本时,一切都很好,但是在常规PowerShell控制台中运行或作为计划任务运行时,不会发送电子邮件。需要注意的是,我可以在PowerShell控制台中运行电子邮件部分的所有内容,并将其写入HTML文件EventID to HTM
EventID to HTML | out file-FilePath$FilePath-Append
。作为一个新手,我确信我处理事情的方式并不完全正确,所以我非常感谢反馈。非常感谢
Clear-Host
# ========================
# Collection Data Section
# ========================
function EventID-To-HTML($ComputerName = $env:COMPUTERNAME) {
$FROMTIME = (Get-Date).AddMinutes(-60)
$Event = get-eventlog -log Application -newest 20 | where {$_.EventID -eq 7071 -AND $_.TimeGenerated -gt $FROMTIME}
$eventstring = @()
Foreach ($i in $Event) {
$eventstring += $i.Message + ", " +$i.TimeGenerated
}
if ($eventstring -eq $NULL){exit}
$GetEventDate = get-eventlog -log Application -newest 1 | where {$_.EventID -eq 7071 -AND $_.TimeGenerated -gt $FROMTIME}
$EventDate = $GetEventDate.TimeGenerated
$htmlStart = "<HTML>
<HEAD>
<style>
body {background-color:rgb(238, 238, 238);}
body, table, td, th {font-family:Calibri; color:Black; Font-Size:11pt}
th {font-weight:bold; background-color:rgb(78, 227, 48);}
td {background-color:rgb(255, 190, 0);}
</style>
</HEAD>
<BODY><div align=center>
<h2><b><br><br>Security Alert: <span Style='font-style:normal; color:Blue'>**Camera(s) Down**</span></b></h2>
<p><b><br>This event occurred at: <span Style='font-style:italic; color:Blue'>$EventDate on $ComputerName</span></b></p>"
$htmlEnd = ''
$htmlStart
$eventstring | ForEach-Object {Add-Member -InputObject $_ -Type NoteProperty -Name Camera -Value $_; $_} | ConvertTo-Html -Property Camera
#$eventstring | %{ New-Object PsObject -Prop @{Length = $_.Length; String = $_} } | ConvertTo-HTML
$htmlStart = ''
$htmlStart = $htmlStart + "<br><br><br><i><span Style='color:red'>This report has been generated by software</i> <br><i>Please DO NOT reply.</i></div>"
$htmlStart
$htmlEnd = ''
$htmlEnd
}
# ======================
# Email Section
# ======================
# Make sure $eventstring has something in it first as to not send an empty message
if ($eventstring.count -ge 1) {
$strFrom = "Sender@domain.com"
$strTo = "recipient@domain.com"
$strSubject = "Subject"
$strSMTPServer = "SMPT Server name"
$objEmailMessage = New-Object system.net.mail.mailmessage
$objEmailMessage.From = ($strFrom)
$objEmailMessage.To.Add($strTo)
$objEmailMessage.Subject = $strSubject
$objEmailMessage.IsBodyHTML = $true
$objEmailMessage.Body = EventID-To-HTML
$objSMTP = New-Object Net.Mail.SmtpClient($strSMTPServer)
$objSMTP.Send($objEmailMessage)
}
清除主机
# ========================
#收集资料组
# ========================
函数EventID到HTML($ComputerName=$env:ComputerName){
$FROMTIME=(获取日期)。添加分钟(-60)
$Event=get eventlog-log Application-newst 20 |其中{$\.EventID-eq 7071-和$\.TimeGenerated-gt$FROMTIME}
$eventstring=@()
Foreach($Event中的i){
$eventstring+=$i.Message+“,”+$i.TimeGenerated
}
如果($eventstring-eq$NULL){exit}
$GetEventDate=get eventlog-log Application-New 1 |其中{$\.EventID-eq 7071-和$\.TimeGenerated-gt$FROMTIME}
$EventDate=$GetEventDate.TimeGenerated
$htmlStart=”
正文{背景色:rgb(238238238238);}
正文,表格,td,th{字体系列:Calibri;颜色:黑色;字体大小:11pt}
th{字体大小:粗体;背景色:rgb(78227,48);}
td{背景色:rgb(255,190,0);}
安全警报:*摄像头已关闭**
此事件发生在$ComputerName上的$EventDate
$htmlEnd=''
$htmlStart
$eventstring | ForEach对象{添加成员-InputObject$|-Type NoteProperty-Name Camera-Value$|$$|转换为Html-属性Camera
#$eventstring |%{New Object PsObject-Prop@{Length=$\.Length;String=$\}}}转换为HTML
$htmlStart=''
$htmlStart=$htmlStart+“
此报告是由软件生成的
请不要回复。”
$htmlStart
$htmlEnd=''
$htmlEnd
}
# ======================
#电子邮件部分
# ======================
#确保$eventstring中首先包含一些内容,以免发送空消息
如果($eventstring.count-ge 1){
$strFrom=”Sender@domain.com"
$strTo=”recipient@domain.com"
$strSubject=“Subject”
$strSMTPServer=“SMPT服务器名称”
$objEmailMessage=新对象system.net.mail.mailmessage
$objEmailMessage.From=($strFrom)
$objEmailMessage.To.Add($strTo)
$objEmailMessage.Subject=$strSubject
$objEmailMessage.IsBodyHTML=$true
$objEmailMessage.Body=EventID到HTML
$objSMTP=新对象Net.Mail.SmtpClient($strSMTPServer)
$objSMTP.Send($objEmailMessage)
}
我怀疑问题是$eventstring的作用域问题。它是在EventID To HTML函数中创建的。由于ISE中作用域的工作方式,此变量在函数运行后仍然可用。通常一个函数在它自己的作用域中运行,当它存在时,作用域将被释放,它将使用在该作用域中创建的所有变量
您可以通过点源函数来测试它,使其在当前范围内运行
. EventID-To-HTML | Out-File -FilePath $filePath -Append
注意点和函数名之间的空格。那一定在那里
避免这种情况的一种方法是使用数组列表之类的集合类型,而不是aray
$eventstring = new-object collections.arraylist
Foreach ($i in $Event) {
$eventstring.add("$($i.Message), $($i.TimeGenerated)") > $nul
我怀疑问题是$eventstring的作用域问题。它是在EventID To HTML函数中创建的。由于ISE中作用域的工作方式,此变量在函数运行后仍然可用。通常一个函数在它自己的作用域中运行,当它存在时,作用域将被释放,它将使用在该作用域中创建的所有变量 您可以通过点源函数来测试它,使其在当前范围内运行
. EventID-To-HTML | Out-File -FilePath $filePath -Append
注意点和函数名之间的空格。那一定在那里
避免这种情况的一种方法是使用数组列表之类的集合类型,而不是aray
$eventstring = new-object collections.arraylist
Foreach ($i in $Event) {
$eventstring.add("$($i.Message), $($i.TimeGenerated)") > $nul
谢谢,我想我需要更多的澄清。如果我在全局范围内生成$eventstring,在我看来,这似乎可以修复它,对吗?可以,但使用全局变量通常被认为是不好的做法。还有其他方法可以避免范围界定问题。一种是使用数组的arralist istead。我用一个例子更新了答案。现在除了发送电子邮件部分
If($eventstring.count-ge 1)之外,一切都正常了{
。如果我将其注释掉,则电子邮件会发送,但是如果注释掉,则不会发送电子邮件。我可以验证数组列表的计数是否确实比函数前面的1大。这就像它释放了数组数据。谢谢,我想我需要更多的澄清。如果我在全局范围内生成$eventstring,在我看来,这似乎可以修复我的错误t、 正确吗?可以,但是使用全局变量通常被认为是不好的做法。还有其他方法可以避免范围问题。一种是使用数组的arralist istead。我用一个例子更新了答案。现在除了发送电子邮件部分If($eventstring.count-ge 1)之外,其他一切都可以正常工作{
。如果我将其注释掉,则电子邮件会发送,但是如果注释掉,则不会发送电子邮件。我可以验证数组列表的计数是否确实大于函数前面的1。这就像它丢失了数组数据一样。