Войти

Показать полную графическую версию : [решено] Как вставить в тело сообщения вывод из данного скрипта -


LLC
17-06-2013, 21:31
Есть скрипт, выводит в окошке части лога:

$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
Не проверял

LLC
18-06-2013, 10:36
В обоих случаях в теле письма пусто, что еще можно посмотреть?

LLC
18-06-2013, 14:49
Первый скрипт 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>

Не могу понять что и где поправить.

snark
12-07-2013, 14:44
У меня получилось примерно так:

$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. Запускать скрипт от администратора, так как нужны права на просмотр журнала безопасности.

LLC
29-07-2013, 17:45
Да, Ваш скрипт тоже работает, в моем проблема в создании таблички в теле письма.
У меня была задача по каждому событию отправлять сообщение, но по факту ничего нормального не получилось, событие создается, запускается скрипт, делает выборку последнего события, а там этих событий уже несколько.
Остановлюсь на Вашем скрипте, пусть шлет отчет раз в день.
Хотелось бы все это оформить в табличку, но так и не разобрался.

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
}
}

snark
30-07-2013, 10:26
В принципе можно привязать алерт на событие »
Разумеется, для этого скрипт и делался. Вопрос только, как далеко в прошлое должен смотреть скрипт. В примере
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