Показать полную графическую версию : [решено] Как вставить в тело сообщения вывод из данного скрипта -
Есть скрипт, выводит в окошке части лога:
$Events = Get-EventLog security -message "*" -before ((get-date -hour 23 -minute 59 -second 59).AddDays(-1)) -after ((get-date -hour 0 -minute 0 -second 0).AddDays(-1)) | ?{$_.eventid -eq 4625}
$Data = New-Object System.Management.Automation.PSObject
$Data | Add-Member NoteProperty Time ($null)
$Data | Add-Member NoteProperty UserName ($null)
$Data | Add-Member NoteProperty Address ($null)
$Events | %{
$Data.time = $_.TimeGenerated
$message = $_.message.split("`n") | %{$_.trimstart()} | %{$_.trimend()}
$Data.UserName = ($message | ?{$_ -like "Имя учетной записи:*"} | %{$_ -replace "(.+):\s*"})
$Data.Address = ($message | ?{$_ -like "Сетевой адрес источника:*"} | %{$_ -replace "^.+:."})
$data
}
и есть скрипт который отправляет почту:
$CredUser = "test@test.ru"
$CredPassword = "pass"
$EmailFrom = "test@test.ru"
$EmailTo = "test@test.ru"
$Subject = "Test mail Subject"
$Body = "test mail"
$SMTPServer = "smtp.test.ru"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer)
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($CredUser, $CredPassword);
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
А вот как их сложить в один не понимаю.
Foreigner
17-06-2013, 21:55
Если я правильно понял и надо отправить по почте хэш $data, то можно добавить второй скрипт к первому и вместо $body использовать $data:
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, [string] $data.values)
Или передавать почтовому скрипту в качестве параметра:
mail.ps1 $([string] $data.values)
B mail.ps1:
$body = $args
Не проверял
В обоих случаях в теле письма пусто, что еще можно посмотреть?
Первый скрипт 2.ps1 :
$Events = Get-EventLog security -message "*" -before ((get-date -hour 23 -minute 59 -second 59).AddDays(-2)) -after ((get-date -hour 0 -minute 0 -second 0).AddDays(-2)) | ?{$_.eventid -eq 4625}
$Data = New-Object System.Management.Automation.PSObject
$Data | Add-Member NoteProperty Time ($null)
$Data | Add-Member NoteProperty UserName ($null)
$Data | Add-Member NoteProperty Address ($null)
$Data | Add-Member NoteProperty ComputerName ($null)
$Events | %{
$Data.time = $_.TimeGenerated
$message = $_.message.split("`n") | %{$_.trimstart()} | %{$_.trimend()}
$Data.UserName = ($message | ?{$_ -like "Имя учетной записи:*"} | %{$_ -replace "(.+):\s*"})
$Data.Address = ($message | ?{$_ -like "Сетевой адрес источника:*"} | %{$_ -replace "^.+:."})
$Data.ComputerName = ($message | ?{$_ -like "Имя рабочей станции:*"} | %{$_ -replace "^.+:."})
}
$body = [string] $Data
$data
$body
.\Send-Email.ps1 -To "test@test.ru" -Subject "Logs" -Body $body
Его вывод в консоле:
PS C:\Script> .\2.ps1
Time UserName Address ComputerName
---- -------- ------- ------------
16.06.2013 8:08:18 {-, administrator} 1.1.1.1 SERVER
@{Time=06/16/2013 08:08:18; UserName=System.Object[]; Address=1.1.1.1; ComputerName=SERVER}
Отправка сообщения Send-Email.ps1 :
param(
[string] $to,
[string] $subject,
[string] $body
)
$style = "<style>BODY{font-family: Arial; font-size: 10pt;}"
$style = $style + "TABLE{border: 1px solid black; border-collapse: collapse;}"
$style = $style + "TH{border: 1px solid black; background: #dddddd; padding: 5px; }"
$style = $style + "TD{border: 1px solid black; padding: 5px; }"
$style = $style + "</style>"
$CredUser = "test@test.ru"
$CredPassword = "pass"
$EmailFrom = "test@test.ru"
$EmailTo = $to
$SMTPServer = "smtp.test.ru"
$message = New-Object System.Net.Mail.MailMessage $EmailFrom, $EmailTo
$message.Subject = $subject
$message.IsBodyHTML = $true
$message.Body = $body | ConvertTo-Html -Head $style
$smtp = New-Object Net.Mail.SmtpClient($smtpServer)
$smtp.Credentials = New-Object System.Net.NetworkCredential($CredUser, $CredPassword);
$smtp.Send($message)
На почту приходит:
*
96
.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">=
<html xmlns=3D"http://www.w3.org/1999/xhtml"> <head> <style>BODY{font-family:=
Arial; font-size: 10pt;}TABLE{border: 1px solid black; border-collapse:=
collapse;}TH{border: 1px solid black; background: #dddddd; padding: 5px;=
}TD{border: 1px solid black; padding: 5px; }</style> </head><body> <table>=
<colgroup> <col/> </colgroup> <tr><th>*</th></tr> <tr><td>96</td></tr>=
</table> </body></html>
Не могу понять что и где поправить.
У меня получилось примерно так:
$Subject = "Microsoft Windows security auditing"
$Theme = "Учетной записи не удалось выполнить вход в систему"
$Server = "mailserver address or IP"
$From = "AuditNotify@firma.ru"
$To = "admin@firma.ru"
$encoding = [System.Text.Encoding]::UTF8
$Body = Get-WinEvent -FilterHashtable @{LogName = "Security";ID = 4625;StartTime = (Get-Date).AddDays(-1)} | Select TimeCreated,`
@{n = "Account";e = {([xml]$_.ToXml()).Event.EventData.Data | ?{$_.Name -eq "SubjectUserName"} | %{$_.'#text'}}}, `
@{n="Workstation name";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "WorkstationName"}| %{$_.'#text'}}},`
@{n="IP Address";e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq "IPAddress"}| %{$_.'#text'}}}
$body = $body -replace "@{" -replace "}" -replace "=", ": " -replace ";","`n" -replace "TimeCreated","Time Created" -replace "^","`n"
$BodyM = $Body
Send-MailMessage -From $From -To $To -SmtpServer $server -Body "$Theme `n$BodyM" -Subject $Subject -Encoding $encoding
Пример почерпнул с глубин интернета, авторство - itpadla, на основе его скрипта сваял этот.
Проверьте, отпишитесь.
P. S. Запускать скрипт от администратора, так как нужны права на просмотр журнала безопасности.
Да, Ваш скрипт тоже работает, в моем проблема в создании таблички в теле письма.
У меня была задача по каждому событию отправлять сообщение, но по факту ничего нормального не получилось, событие создается, запускается скрипт, делает выборку последнего события, а там этих событий уже несколько.
Остановлюсь на Вашем скрипте, пусть шлет отчет раз в день.
Хотелось бы все это оформить в табличку, но так и не разобрался.
Molchune
30-07-2013, 10:16
В принципе можно привязать алерт на событие и он уже будет слать письмо. (мб все таки это лучше чем делать скрипт.)
Ну а так вообще не понимаю в чем трабла
$CredUser = "test@test.ru"
$CredPassword = "pass"
$EmailFrom = "test@test.ru"
$EmailTo = "destinationmail@tets.ru"
$Subject = "Test mail Subject"
$SMTPServer = "smtpserver"
$Events = Get-EventLog security -message "*" -before ((get-date -hour 23 -minute 59 -second 59).AddDays(-1)) -after ((get-date -hour 0 -minute 0 -second 0).AddDays(-1)) | ?{$_.eventid -eq 4625}
$Data = New-Object System.Management.Automation.PSObject
$Data | Add-Member NoteProperty Time ($null)
$Data | Add-Member NoteProperty UserName ($null)
$Data | Add-Member NoteProperty Address ($null)
$Events | %{
$Data.time = $_.TimeGenerated
$message = $_.message.split("`n") | %{$_.trimstart()} | %{$_.trimend()}
$Data.UserName = ($message | ?{$_ -like "Имя учетной записи:*"} | %{$_ -replace "(.+):\s*"})
$Data.Address = ($message | ?{$_ -like "Сетевой адрес источника:*"} | %{$_ -replace "^.+:."})
$Body= "Время логина:" + $data.Time + "`nПользователь:"+$data.Username
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer)
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
}
или
$Events = Get-EventLog security -message "*" -before ((get-date -hour 23 -minute 59 -second 59)) -after ((get-date -hour 0 -minute 0 -second 0)) | ?{$_.eventid -eq 4625}
$encoding = [System.Text.Encoding]::UTF8
$Data = New-Object System.Management.Automation.PSObject
$Data | Add-Member NoteProperty Time ($null)
$Data | Add-Member NoteProperty UserName ($null)
$Data | Add-Member NoteProperty Address ($null)
if ($Events -eq $Null) {write-host !!!NULL!!! } else {
$Events | %{
$Data.time = $_.TimeGenerated
$message = $_.message.split("`n") | %{$_.trimstart()} | %{$_.trimend()}
$Data.UserName = ($message | ?{$_ -like "Имя учетной записи:*"} | %{$_ -replace "(.+):\s*"})
$Data.Address = ($message | ?{$_ -like "Сетевой адрес источника:*"} | %{$_ -replace "^.+:."})
$Body= "Время логина:" + $data.Time + "`nПользователь:"+$data.Username
Send-MailMessage -From test@test.ru -to dest@test.ru -SmtpServer ipserver -Body "$Body" -Subject "Log" -Encoding $encoding
}
}
В принципе можно привязать алерт на событие »
Разумеется, для этого скрипт и делался. Вопрос только, как далеко в прошлое должен смотреть скрипт. В примере
StartTime = (Get-Date).AddDays(-1)
это просмотр всех событий за последние 24 часа.
Можно настроить хоть на 1 минуту:
StartTime = (Get-Date).AddSeconds(-60)
Так что, LLC, пробуйте менять значения на нужные вам.
karencho
06-04-2015, 08:36
+ $SMTPClient.Send <<<< ($EmailFrom, $EmailTo, $Subject, $Body) + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException
такая ошибка выводится при посылки сообщения ,вот скрипт который использовал я можете помочь
$EmailFrom = “acc@yandex.ru”
$EmailTo = “acc@gmail.com”
$Subject = “The subject of your email”
$Body = “What do you want your email to say”
$SMTPServer = “smtp.yandex.ru”
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential(“user”, “pass”);
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.