Powershell Looping через журнал событий - PullRequest
0 голосов
/ 27 сентября 2018

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

Это сценарий, который я работаю, полученный от Microsoft Technet, и я изменил его, чтобы соответствовать моим требованиям.Скрипт работает, как и должно быть, но идет цикл, который я не могу понять, как его остановить.

$ServersToQuery = Get-Content "C:\Users\metho.HOME\Desktop\computernames.txt"
$cred = "home\Administrator"
$StartTime = "September 19, 2018"
#$Yesterday = (Get-Date) - (New-TimeSpan -Days 1)


    foreach ($Server in $ServersToQuery) {

        $LogFilter = @{
            LogName = 'Microsoft-Windows-TerminalServices-LocalSessionManager/Operational'
            ID = 21, 23, 24, 25
            StartTime = (Get-Date).AddDays(-1)
            }

        $AllEntries = Get-WinEvent -FilterHashtable $LogFilter -ComputerName $Server -Credential $cred

        $AllEntries | Foreach { 
            $entry = [xml]$_.ToXml()

            $Output += New-Object PSObject -Property @{
                TimeCreated = $_.TimeCreated
                User = $entry.Event.UserData.EventXML.User
                IPAddress = $entry.Event.UserData.EventXML.Address
                EventID = $entry.Event.System.EventID
                ServerName = $Server
                }        
            } 

    }


    $FilteredOutput += $Output | Select TimeCreated, User, ServerName, IPAddress, @{Name='Action';Expression={
                if ($_.EventID -eq '21'){"logon"}
                if ($_.EventID -eq '22'){"Shell start"}
                if ($_.EventID -eq '23'){"logoff"}
                if ($_.EventID -eq '24'){"disconnected"}
                if ($_.EventID -eq '25'){"reconnection"}
                }
            }

    $Date = (Get-Date -Format s) -replace ":", "-"
    $FilePath = "$env:USERPROFILE\Desktop\$Date`_RDP_Report.csv"
    $FilteredOutput | Sort TimeCreated | Export-Csv $FilePath -NoTypeInformation

Write-host "Writing File: $FilePath" -ForegroundColor Cyan
Write-host "Done!" -ForegroundColor Cyan


#End

В первый раз, когда я запускаю скрипт, он работает нормально, и я получаювывод csv в порядке.Когда я снова запускаю сценарий, создается новый CSV (как и должно быть), но одни и те же записи журнала событий создаются дважды и запускаются снова, чем три записи создаются для одного и того же события.Это очень странно, так как каждый раз создается новый csv, и у меня нет настроенного ключа -append для export-csv.

$FilteredOutput = @()
$Output = @() 

Я попытался добавить эти две строки в приведенном выше сценарии, когда я где-то читал, что это необходимо, если я смешиваю несколько переменных в массив (я не понимаю этого, поэтому аплодисменты, если я ошибаюсь),

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

Спасибо, agian.

mEtho

1 Ответ

0 голосов
/ 27 сентября 2018

Похоже, что переменные $Output и $FilteredOutput не очищаются при следующем запуске сценария (ничто в текущем сценарии не делает этого), поэтому результаты просто добавляются к этим переменным каждыйвремя.

Как вы уже сказали, вы можете добавить их в начало вашего скрипта:

$FilteredOutput = @()
$Output = @() 

Это будет инициализировать их как пустые массивы в начале, что обеспечит ихначните с пустого, а также сделайте возможным добавление к ним (что происходит в скрипте через +=).Без этого при первом запуске сценарий, скорее всего, потерпел неудачу, поэтому я полагаю, что вы уже сделали это в текущем сеансе, чтобы он вообще работал.

...