2016-08-17 4 views
1

Я бью кирпичную стену с этим. Мне было поручено найти журналы IIS в списке серверов Windows и создать отчет обо всех IP-адресах, которые подключаются к серверу в файлах журналов. Если бы я использовал Linux, это было бы легко. Я мог бы просто использовать grep и сократить и сделать это через несколько минут. Однако это внутренние серверы, и у меня нет доступа к ним из оболочки BASH. Я должен создать скрипт и запустить его на каждом сервере локально с помощью powershell.как искать несколько текстовых файлов для IP-адресов и выводить IP-адреса, найденные в текстовый файл, используя powershell?

Как можно ближе к первому запустить скрипт, который ищет все файлы .log в C: \ inetpub \ logs \ LogFiles \ для всего, что похоже на адрес IPV4, и сбрасывает его в CSV-файл

get-childItem C:\inetpub\logs\logfiles\ -include *.log -rec | select-String -pattern ‘\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b’ | select-Object -Propery 'Line' | export-CSV C:\temp\output.txt -notypeinformation 

, который создает файл csv, содержащий каждую строку журнала с IP-адресом в нем. Тогда я бег второго сценария для этого файла, который ищет IP-адреса и выводит их в другой файл (по общему признанию, «заимствованный» где-то в Интернете)

$FilesOfInterest = (
    "*.csv" 
) 

$pattern = ‘\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b’ 

function FindFilesWithContent($Root, $Include, $Pattern){ 
    try{ 
     Get-ChildItem -Path:$Root -Include:$Include ` 
      -Recurse -Force -ErrorAction:SilentlyContinue | 
      ?{!$_.PSIsContainer} | 
     ForEach-Object{ 
      Write-Progress $_.FullName; 
      $item = $_; 
      Get-Content $_ -ErrorAction SilentlyContinue | 
      ForEach-Object { 
       if($_ -match $Pattern){ 
        "" | select filename,match | %{ 
         $_.filename = $item.FullName; 
         $_.match = $matches[0]; 
         return $_ 
        } 
       } 

      } 
     } 
    } 
    catch{ 
    } 
} 


FindFilesWithContent -Root C:\temp -Include $FilesOfInterest -Pattern $pattern |export-csv C:\temp\filtered.csv 

проблема у меня есть, что, как только он находит IP-адрес, он переходит к следующей строке. Каждая строка файла журнала начинается с отметки времени и IP-адреса самого сервера, поэтому в итоге я получаю около 130 000 строк 192.168.1.X, что для меня совершенно бесполезно.

ответ

0

Если бы я использовал Linux, было бы легко. Я мог бы просто использовать grep и сократить и сделать это через несколько минут. Однако это внутренние серверы, и у меня нет доступа к ним из оболочки BASH.

В Windows наиболее жизнеспособным способом эффективного запроса файлов журнала IIS на сегодняшний день является использование Microsoft's LogParser utility.

LogParser поддерживает SQL-подобных запросов, чтобы получить список всех IP-адресов клиентов в журналах:

logparser "SELECT DISTINCT c-ip INTO C:\clientips.txt FROM C:\inetpub\logs\logfiles\*.log" 
0

Для анализа журналов IIS, я настоятельно рекомендую использовать Logparser. Простой в использовании инструмент командной строки, который использует диалект SQL для извлечения информации из источников данных.

Вы можете использовать приведенный ниже код, чтобы получить доступ к вашему IP-адресу. Просто выбрал LogFilename, или если вы хотите проанализировать более одного файла журнала, просто использовать подстановочные знаки, как «C:/журналы/ех *»

logparser "select c-ip, count(c-ip) as requestcount from [LogFileName] group by c-ip order by count(c-ip) desc" 

Если вы не большой поклонник SQL, кто-то написал This с более чем 50 полезными примерами!