Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Email PowerShell脚本赢得';不要在ISE之外运行_Email_Powershell - Fatal编程技术网

Email PowerShell脚本赢得';不要在ISE之外运行

Email PowerShell脚本赢得';不要在ISE之外运行,email,powershell,Email,Powershell,我是全新的PowerShell,提前道歉。我从这里找到的脚本开始:(巨大的赞誉和感谢)并根据我的需要对它进行了调整。基本上,当这个错误代码发生时,它每60秒发布一次,所以我只希望每隔一段时间发送一封电子邮件,在一个基本表中将最近的20个事件转换为HTML。在ISE中执行脚本时,一切都很好,但是在常规PowerShell控制台中运行或作为计划任务运行时,不会发送电子邮件。需要注意的是,我可以在PowerShell控制台中运行电子邮件部分的所有内容,并将其写入HTML文件EventID to HTM

我是全新的PowerShell,提前道歉。我从这里找到的脚本开始:(巨大的赞誉和感谢)并根据我的需要对它进行了调整。基本上,当这个错误代码发生时,它每60秒发布一次,所以我只希望每隔一段时间发送一封电子邮件,在一个基本表中将最近的20个事件转换为HTML。在ISE中执行脚本时,一切都很好,但是在常规PowerShell控制台中运行或作为计划任务运行时,不会发送电子邮件。需要注意的是,我可以在PowerShell控制台中运行电子邮件部分的所有内容,并将其写入HTML文件
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。这就像它丢失了数组数据一样。