IIS: Como receber uma notificação por e-mail quando o arquivo é baixado usando um link direto

3

É possível configurar o IIS para enviar uma notificação por email quando um arquivo dentro de um determinado diretório é baixado? Por ex: qualquer arquivo em www.example.com/download/ ?

    
por Alph.Dev 16.02.2015 / 11:48

3 respostas

1

Sua melhor aposta é provavelmente pesquisar o arquivo de log do IIS em um intervalo razoavelmente pequeno para as solicitações que você está procurando.

O script PowerShell a seguir deve fazer o que você deseja. Obviamente, mude as variáveis para atender às suas necessidades.

# 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)

Eu usei as seguintes páginas para referência.

link

link

    
por 16.02.2015 / 12:46
1

Existe uma maneira de usar o módulo IIS Url Rewrite e um provedor de reconfiguração personalizado. Isso significa que você tem que escrever algum código, mas eu fiz isso para você:

Primeiro, você precisa do módulo Url Rewrite , que é bom ter de qualquer maneira. Instale-o e certifique-se de que funciona.

Em seguida, siga as etapas do artigo Desenvolvimento de um provedor de reconfiguração personalizada para o módulo de regravação de URL

Há uma seção de código nesse artigo, substitua isso com o seguinte:

 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");
     }
 }

Mais abaixo no artigo descreve as alterações na sua configuração da web, use algo assim:

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

O provider type é o nome strong do assembly do provedor criado após o artigo. O settings permite que você especifique um servidor e o destinatário. O match url define para qual URL você está recebendo e-mails.

Isto é apenas uma prova de conceito, mas funcionou bem para mim. Eu tive um problema porque testei isso em um site do IIS que foi definido como 'No Managed Code', você precisa ter um .NET CLR Version set que corresponda à versão na qual você escreveu o provedor.

Além disso, não consegui acessar mais informações sobre a solicitação, como o endereço IP remoto, mas não examinei muito isso.

Enviei o projeto para o GitHub.

    
por 16.02.2015 / 15:39
0

Não conheço uma solução completa, mas procure por isso:

1- use um software para ler o log iis e, com algum e-mail de "código", um resultado quando algo corresponder ao seu arquivo monitorado. Procure por elk stack com saída de email no logstash. Não se esqueça de ativar o registro primeiro.

2- use um aplicativo da web que você codifica para gerar um e-mail quando alguém acessa esse arquivo.

    
por 16.02.2015 / 12:04

Tags