Анализ файлов журнала с помощью регулярного выражения PowerShell - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь проанализировать некоторые файлы журналов аудита контроллера домена с помощью PowerShell, извлекая только те биты данных, которые мне нужны. Например, один из файлов журналов перечисляет доверительные отношения домена, которые существуют в домене, и я пытаюсь проанализировать список доверительных отношений домена и экспортировать его в CSV. После того, как я написал первоначальный сценарий, я намереваюсь использовать его для нескольких других имеющихся у меня файлов журналов аудита, создав новые файлы PowerShell и используя в них различные регулярные выражения. Мой код работает, но он сохраняет только последнее найденное значение, а не все найденные значения.

В приведенном ниже коде я получаю имя сервера на основе имени выходного файла журнала (который я пропустил, чтобы код, который я показываю, был проще!).

$DCDiagArray = @()
$Results = New-Object PSObject
$Dcdiag = Get-Content "D:\Temp\Logs\SERVER01_repadminshowtrust.txt"
$Dcdiag | ForEach-Object{
Switch -RegEx ($_)
{
"TRUSTED.+\s"   { $Trusted   = ($_ -Replace ".*TRUSTED.+\s: ").Trim() }
} 
If ($Trusted -ne $Null)
{
$Results | Add-Member -Name "ServerName" -Value $ServerName -Type NoteProperty -force
$Results | Add-Member -Name "DomTrust" -Value $Trusted -Type NoteProperty -force
$Trusted = $Null
} 
} 
$DCDiagArray += $Results
$DCDiagArray

Вот пример файла журнала:

Repadmin: running command /showtrust against full DC localhost

Domain Trust Info:

    TRUSTED   : DC=domain1,DC=net
    TRUSTED   : DC=domain2,DC=net

Что я должен ожидать в качестве вывода:

ServerName DomTrust
---------- --------
SERVER01   DC=domain1,DC=net
SERVER01   DC=domain2,DC=net

Вместо этого я получаю только:

ServerName DomTrust
---------- --------
SERVER01   DC=domain2,DC=net

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Вы всегда добавляете последнее совпадение к $DCDiagArray.

Измените свой код на:

$DCDiagArray = @()
$Dcdiag = Get-Content "server.txt"
$Dcdiag | ForEach-Object {
    Switch -RegEx ($_) {
        'TRUSTED.*\s' { 
            $Trusted = ($_ -Replace '.*TRUSTED.*\s: ').Trim() 
        }
    } 
    If ($Trusted -ne $Null) {
        $DCDiagArray += [PSCustomObject]@{
            ServerName = "Undef"
            DomTrust = $Trusted
        }
        $Trusted = $Null
    } 
} 
$DCDiagArray

Возвращается (имя сервера не задано в моем примере):

ServerName DomTrust
---------- --------
Undef      DC=domain1,DC=net
Undef      DC=domain2,DC=net

Пока не требуется обратной совместимости с PowerShell 2, вы можете создать CustomPSObject через хеш-таблицу в виде:

[pscustomobject] @{
   Name = "Value"
}

Вместо $Results = New-Object PSObject.

Надеюсь, что помогает

0 голосов
/ 07 мая 2019

$DCDiagArray += $Results необходимо переместить в блок сценария Foreach-Object:

$DCDiagArray = @()
$Dcdiag = Get-Content "D:\Temp\Logs\SERVER01_repadminshowtrust.txt"
$Dcdiag | ForEach-Object{
Switch -RegEx ($_)
{
"TRUSTED.+\s"   { $Trusted   = ($_ -Replace ".*TRUSTED.+\s: ").Trim() }
} 
If ($Trusted -ne $Null)
{
$Results = New-Object PSObject
$Results | Add-Member -Name "ServerName" -Value $ServerName -Type NoteProperty -force
$Results | Add-Member -Name "DomTrust" -Value $Trusted -Type NoteProperty -force
$DCDiagArray += $Results
$Trusted = $Null
} 
} 
$DCDiagArray

Проблема заключается в том, что свойство DomTrust перезаписывается при обработке каждого объекта ($_).Как только эта команда Foreach-Object завершит , , тогда вы добавите ее в свой массив $DCDiagArray.В результате вы видите только последнее обработанное значение.

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