Мне поручено сделать резервную копию всех журналов событий на всех серверах и хранить их в течение 30 дней. Для этого я написал простую оболочку PowerShell.
Get-winevent -Listlog * | select Logname, Logfilepath | ForEach-Object -Process {
$name = $_.Logname
$path = $_.logfilepath
wevtutil.exe EPL $name C:\Users\Owner\Desktop\eventlogs\$name.evtx`
}
Это экспортирует файлы журнала только для журналов событий NTclassic, для остальных журналов, которые я получаю, система не может найти ошибку, указанную путем. Я изменил wevtutil и включил параметр / lf и передал переменную $ path, она все та же. За исключением классических журналов, для всего остального я получаю ошибку ниже.
wevtutil.exe : Failed to export log Microsoft-Windows-WPD-MTPClassDriver/Operational.
The system cannot find the path specified.
At line:19 char:1
+ wevtutil.exe EPL $name C:\Users\Owner\Desktop\eventlogs\$name.evtx
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Failed to expor...path specified.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandErrorBlockquote
Есть ли другой лучший способ выполнить то, что я пытаюсь сделать, пожалуйста?
Проблема в том $name
переменная. Если вы проверите, какие файлы экспорта создаются, и вы не заметите, что все имена журналов, содержащие косую черту /
сгенерируйте сообщение об ошибке. Причина в том, что /
является недопустимым символом в имени файла (в Windows).
Вы можете запустить экспорт, заменив /
с допустимым символом:
Get-winevent -Listlog * | select Logname, Logfilepath | ForEach-Object -Process {
$name = $_.Logname
$safename = $name.Replace("/","-")
wevtutil.exe EPL $name C:\Users\Owner\Desktop\eventlogs\$safename.evtx
}