Можно ли настроить IIS для отправки уведомления по электронной почте при загрузке файла в определенном каталоге? Например: любой файл в www.example.com/download/
?
Есть способ сделать это с помощью модуля IIS Url Rewrite и настраиваемого Rewrite Provider. Это означает, что вам нужно написать код, но я сделал это за вас:
Во-первых, вам понадобится Модуль перезаписи URL, в любом случае это хорошо. Установите его и убедитесь, что он работает.
Далее следуйте инструкциям в статье Разработка настраиваемого поставщика перезаписи для модуля перезаписи URL
В этой статье есть раздел кода, замените его следующим:
using System;
using System.Collections.Generic;
using System.Net.Mail;
using Microsoft.Web.Iis.Rewrite;
public class DownloadAlerter : IRewriteProvider, IProviderDescriptor
{
private string recipient, sender, server;
public void Initialize(IDictionary<string, string> settings, IRewriteContext rewriteContext)
{
if (!settings.TryGetValue("Recipient", out recipient) || string.IsNullOrEmpty(recipient))
throw new ArgumentException("Recipient provider setting is required and cannot be empty");
if (!settings.TryGetValue("Sender", out sender) || string.IsNullOrEmpty(sender))
throw new ArgumentException("Sender provider setting is required and cannot be empty");
if (!settings.TryGetValue("Server", out server) || string.IsNullOrEmpty(server))
throw new ArgumentException("Server provider setting is required and cannot be empty");
}
public string Rewrite(string value)
{
MailMessage message = new MailMessage();
message.From = new MailAddress(sender);
message.To.Add(new MailAddress(recipient));
message.Subject = "Download Alert";
message.Body = string.Format("The following URL was downloaded: '{0}'" + Environment.NewLine + "For details check your IIS logs", value);
SmtpClient client = new SmtpClient();
client.Host = server;
client.Send(message);
return value;
}
public IEnumerable<SettingDescriptor> GetSettings()
{
yield return new SettingDescriptor("Recipient", "Email address of the recipient");
yield return new SettingDescriptor("Sender", "Email address of the sender");
yield return new SettingDescriptor("Server", "The SMTP server to be used");
}
}
Далее в статье описаны изменения в вашей веб-конфигурации, вместо этого используйте что-то вроде этого:
<rewrite>
<providers>
<provider name="DownloadAlerter" type="DownloadAlerter, Hahndorf.IIS.DownloadAlertProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx">
<settings>
<add key="Recipient" value="peter@******.****" />
<add key="Sender" value="iis@******.****" />
<add key="Server" value="localhost" />
</settings>
</provider>
</providers>
<rules>
<rule name="Test">
<match url="specific-page\.html" />
<action type="Rewrite" url="{DownloadAlerter:{URL}}" appendQueryString="false" />
</rule>
</rules>
</rewrite>
В provider type
- строгое имя сборки поставщика, созданного вами после статьи. В settings
позволяют указать сервер и получателя. В match url
определяет, для какого URL вы получаете электронные письма.
Это всего лишь проверка концепции, но у меня все сработало. У меня возникла проблема, потому что я тестировал это на сайте IIS, для которого было установлено значение «Без управляемого кода», вам необходимо иметь .NET CLR Version
набор, соответствующий версии, в которой вы написали поставщика.
Кроме того, я не мог больше получить доступ к информации о запросе, такой как удаленный IP-адрес, но я не особо в этом разбирался.
Я загрузил проект на GitHub.
Лучше всего, вероятно, опросить файл журнала IIS через разумно небольшой интервал для запросов, которые вы ищете.
Следующий сценарий PowerShell должен делать то, что вы хотите. Очевидно, измените переменные в соответствии с вашими потребностями.
# Directory of IIS log files
$Path = "C:\inetpub\logs\LogFiles\W3SVC1"
#Get the most recent log file from the directory
$File = Get-ChildItem $Path | sort LastWriteTime | select -last 1
# Get-Content gets the file, pipe to Where-Object and skip the first 3 lines.
$Log = Get-Content $File.FullName | where {$_ -notLike "#[D,S-V]*" }
# Replace unwanted text in the line containing the columns.
$Columns = (($Log[0].TrimEnd()) -replace "#Fields: ", "" -replace "-","" -replace "\(","" -replace "\)","").Split(" ")
# Count available Columns, used later
$Count = $Columns.Length
# Get all Rows that i Want to retrieve
$QueryString = "*GET*"
$Rows = $Log | where {$_ -like $QueryString}
# Create an instance of a System.Data.DataTable
$IISLog = New-Object System.Data.DataTable "IISLog"
# Loop through each Column, create a new column through Data.DataColumn and add it to the DataTable
foreach ($Column in $Columns) {
$NewColumn = New-Object System.Data.DataColumn $Column, ([string])
$IISLog.Columns.Add($NewColumn)
}
# Loop Through each Row and add the Rows.
foreach ($Row in $Rows) {
$Row = $Row.Split(" ")
$AddRow = $IISLog.newrow()
for($i=0;$i -lt $Count; $i++) {
$ColumnName = $Columns[$i]
$AddRow.$ColumnName = $Row[$i]
}
$IISLog.Rows.Add($AddRow)
}
#Format Log data into string for sending
$BodyString = ""
foreach( $Row in $IISLog.Rows ){
$BodyString = $BodyString + $Row.date + " " + $Row.time + " " + $Row.sip + " " + $Row.csuriquery + "`n"
}
# Variables for sending email
$MailServer = "NAME OF YOUR MAIL SERVER"
$FromAddress = ""
$ToAddress = ""
$Subject = ""
$SMTP = New-Object Net.Mail.SmtpClient($MailServer)
$SMTP.Send($FromAddress,$ToAddress,$Subject,$BodyString)
Я использовал следующие страницы для справки.
Не знаю универсального решения, но ищите следующее:
1. Используйте программное обеспечение для чтения журнала iis и с некоторым "кодом" по электронной почте, когда что-то совпадает с вашим отслеживаемым файлом. Ищите стек лося с выводом электронной почты в logstash. Не забудьте сначала включить ведение журнала.
2- используйте кодированное вами веб-приложение для создания письма, когда кто-то получает доступ к этому файлу.