Как отфильтровать определенные слова с помощью Power Shell - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь выяснить, кто печатал с сервера печати 2008 года.Я сгенерировал файл журнала из диспетчера сервера и теперь храню эту информацию в CSV-файле.Моя цель состоит в том, чтобы проанализировать эту информацию и экспортировать ее в новый csv, чтобы найти единственных партнеров user ID, computer host name и printer name, все они включены в файл журнала csv, чтобы я мог определить, кто печатает из этогои убедитесь, что я могу сопоставить их с нашим новым сервером печати.CSV состоит из одного столбца данных, который имеет шаблон.

Каждая строка в CSV соответствует шаблону ниже, но формулировка отличается для каждой строки, так как имя задания длиннее / короче или другие биты информациичто я не хочу.

Общий шаблон:

Document #, job name owned by **user ID** on **computer host name** was printed on **printer name** through port ********  

Больше информации я не хочу

Моя проблема в том, что я не могу жесткий кодчто-то вроде игнорирования первых 5 слов в каждой строке, тогда 6-е слово будет идентификатором пользователя и т. д., так как формат каждой строки различен.

Каков наилучший способ игнорировать все слова вплоть дофразу «принадлежит» или, что еще лучше, идентификатору пользователя, сохранить его в новом csv in, а затем сделать то же самое для имени хоста компьютера и имени принтера?

Ответы [ 3 ]

1 голос
/ 29 марта 2019

Ответ TheMadTechnician уже охватывает большинство из них.

$a = Get-Content original.csv
$a[0] += ",Data"
$a | Set-Content updated.csv
$csv = Import-Csv updated.csv

$data = $csv.where({$_."Event ID" -eq 307}) | Select-String -pattern "(?<=owned by )(?<user>[^ ]+)(?: on )(?<host>.*?)(?: was printed on )(?<printer>.*?)(?= through )"

$(ForEach ($m in $data.matches) {
    [pscustomobject][ordered]@{"User"=$m.groups["user"].value
                "Host"=$m.groups["host"].value
                "Printer"=$m.groups["printer"].value
    }
}) | Export-Csv Output.csv -notypeinformation

Есть некоторые проблемы с CSV, который экспортируется с сервера печати Windows. Если перечисленные ниже вопросы не имеют значения в этом случае, я могу просто удалить этот ответ.

  1. Столбец CSV, содержащий данные, которые вас интересуют, не имеет названия. Другие столбцы имеют заголовки, но по некоторым причинам этот не имеет. Без этого заголовка ваша команда Import-Csv будет бесполезной. Первые четыре строки кода охватывают добавление заголовка Data к этому файлу. Таким образом, вы можете использовать код, чтобы исправить это, или просто открыть файл, добавить имя столбца и сохранить.
  2. Идентификатор события, о котором вы заботитесь - 307. В этом журнале событий много других шумов, если только вы не отфильтровали его перед сохранением в виде CSV, и это может повлиять на соответствие регулярному выражению.

Мой метод здесь действительно ничем не отличается от другого опубликованного ответа. Я просто сопоставляю меньше строк и получаю доступ к этим совпадениям с помощью именованных индексов.

1 голос
/ 29 марта 2019

Это можно сделать достаточно легко, используя сопоставление регулярных выражений. Регулярные выражения используют сопоставление с образцом, поэтому вы можете сделать что-то вроде:

Get-Content LogFile.csv | Where{$_ -match "^(.*?),.+? owned by (.+?) on (.+?) was printed on (.+?) through port (.+)"} | ForEach{
    [PSCustomObject]@{
        JobNumber=$Matches[1]
        UserId=$Matches[2]
        ComputerName=$Matches[3]
        PrinterName=$Matches[4]
        Port=$Matches[5]
    }
}|Export-Csv NewLogFile.csv -NoTypeInfo

Это даст вам CSV, который вы можете открыть в Excel или что-то в этом роде, указав только номер задания, идентификатор пользователя, компьютер, который они использовали, принтер и порт, на котором он работал.

0 голосов
/ 29 марта 2019

Это не ответ о том, как извлечь информацию из текста сообщения, а о том, как избежать необходимости иметь дело с форматированным текстом в первую очередь. Похоже, вы пытаетесь проанализировать сообщение для событий журнала событий с идентификатором 307. Этот код адаптирован из PowerShell One-Liner для аудита заданий печати на сервере печати Windows * .

Используя Get-WinEvent командлет , вы можете запросить определенный журнал (Microsoft-Windows-PrintService/Operational) для определенных событий (307), а затем нужно просто найти и добавить значимое имя для каждого свойство ...

$eventFilter = @{
    LogName = 'Microsoft-Windows-PrintService/Operational';
    ID = 307;
}

Get-WinEvent -FilterHashTable $eventFilter `
    | Select-Object -Property `
        'TimeCreated', `
        @{ Name = 'JobId';       Expression = { $_.Properties[0].Value }; }, `
        @{ Name = 'JobName';     Expression = { $_.Properties[1].Value }; }, `
        @{ Name = 'UserName';    Expression = { $_.Properties[2].Value }; }, `
        @{ Name = 'MachineName'; Expression = { $_.Properties[3].Value }; }, `
        @{ Name = 'PrinterName'; Expression = { $_.Properties[4].Value }; }, `
        @{ Name = 'PortName';    Expression = { $_.Properties[5].Value }; }, `
        @{ Name = 'ByteCount';   Expression = { $_.Properties[6].Value }; }, `
        @{ Name = 'PageCount';   Expression = { $_.Properties[7].Value }; }

Для события с таким сообщением ...

Документ 1, Распечатать документ, принадлежащий UserName на \\ MachineName был распечатывается в Microsoft Print в PDF через порт X: \ Directory \ File.ext. Размер в байтах: 12345. Распечатано страниц: 1. Никаких действий пользователя не требуется.

... приведенный выше код выведет объект, подобный этому ...

TimeCreated : 3/28/2019 5:36:41 PM
JobId       : 1
JobName     : Print Document
UserName    : UserName
MachineName : \\MachineName
PrinterName : Microsoft Print to PDF
PortName    : X:\Directory\File.ext
ByteCount   : 12345
PageCount   : 1

Вы можете передать вышеприведенную команду в Export-CSV, чтобы создать файл CSV, или даже просто использовать Out-GridView, чтобы просмотреть и отфильтровать данные непосредственно в PowerShell. В любом случае, анализ не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...