Работа с журналами событий Windows в PowerShell

У меня есть сценарий для чтения последних 30 записей в журналах приложений и системных событий, в настоящее время сценарии работают только на моей машине и выводят только частичное сообщение (см., например, ниже).

411905 5 мая 15:05 Информация Microsoft-Windows... 1501 Параметры групповой политики для пользователя успешно обработаны. Никаких изменений не обнаружено с момента последней успешной...

Может ли кто-нибудь сказать мне, как можно сделать следующее

  1. используйте это для удаленных компьютеров - я пытался ввести имя компьютера в формате \домен\имя_компьютера, но это не работает
  2. Как я могу отобразить полное сообщение, а не только раздел
  3. Как я могу сохранить файл с именем компьютера как часть имени файла, например. "приложение mycomputer log.txt"

Мой скрипт пока такой

Get-EventLog -LogName Application -Newest 30  -ComputerName MYCOMPUTER | Out-File -FilePath "D:\Test\Application Event Logs.txt" 

Get-EventLog -LogName System -Newest 30 -ComputerName MYCOMPUTER | Out-File -FilePath "D:\Test\System Event Logs.txt" 

Я новичок в написании сценариев и подумал, что это может быть полезно, но я не могу заставить его работать.


person noelmm    schedule 05.05.2016    source источник


Ответы (1)


Удаленные компьютеры

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

Вместо этого вы можете использовать удаленное взаимодействие PowerShell для запуска любых команд powershell, существующих на удаленном компьютере. Но вы должны настроить удаленный доступ к удаленному компьютеру и использовать SSL или доверенные хосты с явными учетными данными, чтобы гарантировать, что соединение будет разрешено:

$credential = Get-Credential # enter credentials for remote machine
$session = New-PSSession -ComputerName REMOTECOMPUTER -Credential $credential
Invoke-Command -Session $session -ScriptBlock {
    Get-EventLog # parameters
}

Полный текст

Важно отметить, что Get-WinEvent возвращает сложный объект. То, что вы видите, когда оно отображается на экране, — это просто представление. Прямая запись в файл также будет просто представлением. Вместо этого явно определите, что вы хотите, создайте строку, а затем запишите ее в файл.

Начните с присвоения результата командлета переменной, чтобы вы могли ее проверить:

$events = Get-WinEvent #params

Теперь вы можете посмотреть на результаты:

$events | Get-Member  # see what properties are available

Итак, вы видите, что Message — это свойство.

Чтобы получить только сообщение, вы можете использовать Select-Object, а поскольку вам нужна строка, а не свойство, вы -ExpandProperty:

$events | Select-Object -ExpandProperty Message | Out-File #etc

Это выписало бы все сообщения (но никакой другой информации).

На практике вы можете захотеть работать с каждой возвращаемой записью журнала и создавать свою строку для записи в файл:

$events | ForEach-Object {
    # $_ represents the current object
    $msg = $_.Message
    $id = $_.Id
    $timeCreated = $_.TimeCreated

    "A log entry with ID $id was created at $timeCreated, and it says:`r`n`r`n$msg`r`n---------`r`n"
} | Out-File #params

Использование имени компьютера

Предполагая, что вы заранее знаете имя компьютера, который вы проверяете, поместите его в переменную, а затем вставьте в имя файла:

$computer = 'MYCOMPUTER'
Get-WinEvent -ComputerName $computer | ForEach-Object {
    # do stuff like above
} | Out-File -Path "D:\Whatever\$computer Application Log"
person briantist    schedule 05.05.2016
comment
Спасибо, я должен был сказать, что компьютеры находятся в одном домене. - person noelmm; 06.05.2016