KapralBel
Platinum Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Код: # v4.0 # ===================== # ==================== Константы - начало # ===================== # Частота вызова скрипта # $Interval - частота вызова в единицах, заданных в $IntervalSelector # $IntervalSelector - временной интервал # h - часы # n - минуты # d - дни (default) # m - месяцы $strComputerName = $Env:ComputerName $iInterval = 1 $strIntervalSelector = 'd' $bLastTime = $True $strEMailDomain = 'Firma.Com' $strEMailTo = 'Administrator@' + $strEMailDomain $strEMailFrom = '@EventLog.' + $strEMailDomain $strSMTPHost = 'SMTP.' + $strEMailDomain $strEMailFrom = $strComputerName + $strEMailFrom $iSMTPPort = 25 $strDateFormat = 'dd/MM/yy, HH:mm' #$UTF8 = New-Object System.Text.UTF8Encoding $cdrUTF8 = [System.Text.Encoding]::UTF8 $eletError = [System.Diagnostics.EventLogEntryType]::Error $eletInfo = [System.Diagnostics.EventLogEntryType]::Information $eletWarn = [System.Diagnostics.EventLogEntryType]::Warning $eletSA = [System.Diagnostics.EventLogEntryType]::SuccessAudit # ===================== # ==================== Константы - конец # ===================== For ($i=0;$i -lt $Args.Count;$i++) { If ($Args[$i] -eq '-Time') { $iInterval=$Args[$i+1] } If ($Args[$i] -eq '-S') { $strIntervalSelector=$Args[$i+1] } If ($Args[$i] -eq '-DateTime') { $bLastTime=$False } If ($Args[$i] -imatch '[?]') { Write-Color ' <TDarkRed_>Выборка из журнала событий ошибок и предупреждений (v4.0) <TYellow_>Get-EventLogEW <TWhite_>[-DateTime] | [-Time <N>] [-S <interval>] [-?|/?] <TBlue_>где: <TMagenta_>-?/? <TWhite_> - вызов данной справки <TMagenta_>-DateTime <TWhite_> - Анализ журнала событий не от времени последнего запуска скрипта А за явно указанный промежуток времени По умолчанию в скрипте прописаны последние сутки см. ключи <TYellow_>-Time <TWhite_>и <TYellow_>-S <TMagenta_>-Time <TCyan_><N><TWhite_> - Указывает сколько времени анализировать (по умолчанию 1) <TMagenta_>-S <TCyan_><str><TWhite_> - Указывает в каких временных единицах считать интервал По умолчанию <TYellow_>d<TWhite_> - дни Может принимать значения: <TYellow_>h<TWhite_> - часы <TYellow_>n<TWhite_> - минуты <TYellow_>d<TWhite_> - дни (по умолчанию) <TYellow_>m<TWhite_> - Месяцы Ключи <TYellow_>-Time,-S<TWhite_> без ключа <TYellow>-DateTime<TWhite_> - не играют роли вместе с ним могут использоваться по раздельности Ключ <TYellow_>-DateTime<TWhite_> без ключей <TYellow_>-Time,-S<TWhite_> берет интервал в 1 сутки Исключение составляет первый запуск скрипта - в этом случае всегда используется интервал либо явно прописанный в командной строке, либо по умолчанию' Exit } } $Tmp = Get-Item hklm:\software\PowerShellScript\Get-EventLogEW -Force -ErrorAction SilentlyContinue $TmpCnt = ($Tmp | Get-Member -ErrorAction SilentlyContinue).Count+0 If ($TmpCnt -eq 0) { $tmp=New-Item -Path HKLM:\SOFTWARE\PowerShellScript\Get-EventLogEW -Force -ErrorAction SilentlyContinue } $dtNow=Date If ($strIntervalSelector -eq 'h') { $dtPrev=$dtNow.AddHours(-$iInterval) } ElseIf ($strIntervalSelector -eq 'n') { $dtPrev=$dtNow.AddMinutes(-$iInterval) } ElseIf ($strIntervalSelector -eq 'm') { $dtPrev=$dtNow.AddMonths(-$iInterval) } Else { $dtPrev=$dtNow.AddDays(-$iInterval) } $rgKeyPr = Get-ItemProperty -Path HKLM:\SOFTWARE\PowerShellScript\Get-EventLogEW -Name Date -ErrorAction SilentlyContinue $rgKeyPrCnt = ($rgKeyPr | Get-Member -ErrorAction SilentlyContinue).Count+0 If ($rgKeyprCnt -eq 0) { Set-ItemProperty -Path HKLM:\SOFTWARE\PowerShellScript\Get-EventLogEW -Name Date $dtPrev } if ($bLastTime -eq $True) { $strTmp=(New-Object -ComObject WScript.Shell).RegRead('HKLM\SOFTWARE\PowerShellScript\Get-EventLogEW\Date') $dtPrev = Get-Date -Date $strTmp $dtPrev=$dtPrev.AddMinutes(-2) } Set-ItemProperty -Path HKLM:\SOFTWARE\PowerShellScript\Get-EventLogEW -Name Date $dtNow.ToString('dd/MM/yyyy HH:mm:ss') -Force -ErrorAction SilentlyContinue $objEventLogs=Get-EventLog -List $iCountErrTotal=0 For($i=0;$i -lt $objEventLogs.Count;$i++) { $objEventLog = $objEventLogs.Get($i) $objEventLogMessages = Get-EventLog $objEventLog.Log $objEventLogMessages = $objEventLogMessages | Where-Object {$_.TimeWritten -le $dtNow -and $_.TimeWritten -ge $dtPrev} $objEventLogMessages = $objEventLogMessages | Where-Object {$_.EntryType -ne $eletInfo -and $_.EntryType -ne $eletSA} $iCountErrCurrentEventLog = 0 $strBodyText = '' $iCountErrCurrentEventLog += $objEventLogMessages.Count $iCountErrTotal += $objEventLogMessages.Count For($j=0;$j -lt $objEventLogMessages.Count;$j++) { $objEventLogMessage = $objEventLogMessages[$j] $objEventLogMessage.EntryType If ($objEventLogMessage.EntryType -eq $eletInfo) {'Info'} Else {'No info'} If ($j -eq 0) { $strBodyText = $strBodyText+('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">') $strBodyText = $strBodyText+('<html>') $strBodyText = $strBodyText+('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />') $strBodyText = $strBodyText+('<head><title>'+$strMsg+'</title>') $strBodyText = $strBodyText+('</head>') $strBodyText = $strBodyText+('<h2 align="center">'+$strHeaderHTML+'</h2>') $strBodyText = $strBodyText+('<table width="100%" border="1" cellspacing="2" cellpadding="2" align="center">') $strBodyText = $strBodyText+('<tr><th>№</th><th>Тип</th><th>Дата</th><th>Время</th><th>Комп</th><th>Пользователь</th><th>Сообщение</th></tr>') } $strMsg = 'Журнал ['+$objEventLog.LogDisplayName+'] за период ['+$dtPrev.ToString($strDateFormat)+" .. "+$dtNow.ToString($strDateFormat)+']' $strHeaderHTML = 'Журнал ['+$objEventLog.LogDisplayName+']<br>за период ['+$dtPrev.ToString($strDateFormat)+" .. "+$dtNow.ToString($strDateFormat)+']' $strBodyText = $strBodyText+('<tr align="left">') $strBodyText = $strBodyText+('<td>'+$j+'</td>') $strBodyText = $strBodyText+('<td>'+$objEventLogMessage.get_EntryType().ToString()+'<br>'+$objEventLogMessage.Source+"<br>"+$objEventLogMessage.EventID+'</td>') $strBodyText = $strBodyText+('<td>'+$objEventLogMessage.TimeWritten.ToString('dd/MM/yyyy')+'</td>') $strBodyText = $strBodyText+('<td>'+$objEventLogMessage.TimeWritten.ToString('HH:mm:ss')+'</td>') $strBodyText = $strBodyText+('<td>'+$objEventLogMessage.MachineName+' </td>') $strBodyText = $strBodyText+('<td>'+$objEventLogMessage.UserName+' </td>') $strBodyText = $strBodyText+('<td>'+$objEventLogMessage.Message+'</td>') $strBodyText = $strBodyText+('</tr>') } If ($iCountErrCurrentEventLog -gt 0) { $strBodyText = $strBodyText+('</table>') $strBodyText = $strBodyText+('</body>') $strBodyText = $strBodyText+('</html>') $SMTPClient = new-object System.Net.Mail.SMTPClient $Msg = new-object System.Net.Mail.MailMessage $Msg.From = $strEMailFrom $Msg.Subject = $strComputerName+': '+$strMsg $Msg.IsBodyHTML = 1 $Msg.BodyEncoding = $cdrUTF8 $Msg.Body = $strBodyText $SMTPClient.Host = $strSMTPHost $SMTPClient.Port = $iSMTPPort $Msg.To.Add($strEMailTo) $SMTPClient.Send($Msg) } } If ($iCountErrTotal -eq 0) { $strMsg = $strComputerName+': За период ['+$dtPrev.ToString($strDateFormat)+" .. "+$dtNow.ToString($strDateFormat)+'] ошибок и предупреждений в журнале событий нет' $SMTPClient = new-object System.Net.Mail.SMTPClient $Msg = new-object System.Net.Mail.MailMessage $Msg.From = $strEMailFrom $Msg.Subject = $strMsg $Msg.Body = $strMsg $SMTPClient.Host = $strSMTPHost $SMTPClient.Port = $iSMTPPort $Msg.To.Add($strEMailTo) $SMTPClient.Send($Msg) } | Получение справки по скрипту get-EventLogEW.ps1 /? Внимание! Для получения справки требуется наличие Write-Color | Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 13:58 04-08-2007 | Исправлено: KapralBel, 13:59 04-08-2007 |
|