- PowerShell merekodkan aktiviti anda dalam log Windows PowerShell dan membolehkan anda melaraskan apa yang ditulis dengan pembolehubah keutamaan.
- Get-EventLog bagus untuk log klasik; Penapis Get-WinEvent dan hashtable ialah pilihan yang moden dan lebih cekap.
- Untuk EVTX asli, gunakan wevtutil epl; untuk data jadual, Select-Object dan Export-Csv menghalang pemotongan.
Jika anda bekerja dengan sistem Windows, lambat laun anda perlu mendapatkan semula laporan daripada log peristiwa. PowerShell ialah pisau Tentera Swiss untuk membuat pertanyaan, menapis dan mengeksport log. tanpa bergantung pada klik dalam Pemapar Acara, dan juga membolehkan anda mengautomasikannya untuk berbilang komputer sekaligus.
Dalam baris berikut, anda akan menemui panduan praktikal dan sangat lengkap, disusun daripada rujukan yang boleh dipercayai dan kes sebenar, untuk memahami cara PowerShell merekodkan aktivitinya sendiri, cara melihat data tersebut dan, terutamanya, Cara mengeksport acara ke CSV, XML dan EVTX dengan teknik yang mantap berdasarkan Get-EventLog, Get-WinEvent dan utiliti wevtutil.
Cara PowerShell merekodkan peristiwa dan tempat untuk melihatnya
Windows mencipta log khusus yang dipanggil Windows PowerShell untuk merekodkan aktiviti penterjemah dan pembekalnya. Log ini boleh dibuka daripada Pemapar Acara atau daripada PowerShell. dengan cmdlet yang membaca acara, seperti Get-EventLog.
Secara lalai, sistem menulis peristiwa enjin dan vendor, walaupun anda boleh melaraskan perkara yang ditangkap menggunakan pembolehubah keutamaan. Ia juga boleh dilakukan untuk menambah butiran tentang pelaksanaan arahan jika anda memerlukan butiran lanjut untuk diagnosis.
Untuk melihat dengan segera kandungan pendaftaran Windows PowerShell daripada konsol, anda boleh menjalankan:
Get-EventLog -LogName 'Windows PowerShell'. Kemudian, gunakan Sort-Object, Group-Object dan cmdlet pemformatan untuk mengisih, mengumpulkan atau mempersembahkan output dengan cara yang lebih mudah dibaca.
Contohnya, untuk mengumpulkan mengikut ID acara anda mempunyai beberapa pilihan yang berguna:
Get-EventLog 'Windows PowerShell' | Format-Table -GroupBy EventID
Get-EventLog 'Windows PowerShell' | Sort-Object EventID | Group-Object EventID. Jika anda perlu melihat semua rekod klasik yang tersedia dalam pasukan, lari Get-EventLog -List.
Selain cmdlet pendaftaran, anda boleh menggunakan WMI untuk memeriksa butiran fail .evt dan .evtx. Dengan Get-WmiObject anda boleh menanyakan kelas Win32 yang berkaitan dengan acara, sebagai contoh:
Get-WmiObject Win32_NTEventlogFile | Where-Object LogFileName -EQ 'Windows PowerShell' | Format-List -Property *
Get-WmiObject -List | Where-Object Name -Like 'Win32*Event*'
Memilih perkara yang hendak direkodkan: pembolehubah keutamaan
PowerShell mendedahkan enam pembolehubah keutamaan untuk menentukan peristiwa yang berakhir dalam log Windows PowerShell. Terdapat dua pembolehubah bagi setiap skop rekod: enjin, pembekal dan arahan. Pembolehubah LifecycleEvent merekodkan peristiwa mula dan tamat biasa; Pembolehubah kesihatan merekodkan kesilapan.
| Pembolehubah | Apa yang direkodkan |
|---|---|
$LogEngineLifecycleEvent |
Boot dan hentikan enjin PowerShell |
$LogEngineHealthEvent |
Ralat Program PowerShell |
$LogProviderLifecycleEvent |
Memulakan dan menamatkan pembekal PowerShell |
$LogProviderHealthEvent |
Ralat Pembekal PowerShell |
$LogCommandLifecycleEvent |
Perintah permulaan dan penamat |
$LogCommandHealthEvent |
Ralat arahan |
Jenis berikut diaktifkan secara lalai: $LogEngineLifecycleEvent, $LogEngineHealthEvent, $LogProviderLifecycleEvent y $LogProviderHealthEvent. Untuk mengaktifkan atau menyahaktifkan sebarang jenis hanya tugaskan $true o $false kepada pembolehubah yang sepadan dalam sesi semasa:
# Activar eventos de ciclo de vida de comandos
$LogCommandLifecycleEvent = $true
# Desactivar eventos de ciclo de vida de proveedores
$LogProviderLifecycleEvent = $false
Nota: Terdapat peristiwa tertentu yang tidak boleh dilumpuhkan, seperti yang menunjukkan bahawa enjin PowerShell atau pembekal teras telah dimulakan. Ia dijana sebelum profil dimuatkan dan hos menerima arahan., jadi mereka tidak bergantung pada konfigurasi anda. Jika anda mahu tetapan ini sentiasa digunakan, tambahkan pemetaan pada profil PowerShell anda.
Log masuk pelaksanaan modul dan pemalam
Sejak PowerShell 3.0, modul dan snap-in boleh log pelaksanaan fungsi dan cmdlet dengan menetapkan sifat LogPipelineExecutionDetails mereka kepada $true. Dalam PowerShell 2.0, ciri ini hanya tersedia untuk snap-in., tetapi dalam versi moden ia juga digunakan untuk modul.
Apabila LogPipelineExecutionDetails sah $true, PowerShell menulis acara pelaksanaan sesi ke log Windows PowerShell dalam Pemapar Acara. Perubahan hanya mempengaruhi sesi semasa., melainkan anda memaksanya melalui arahan.
# Módulos
Import-Module Microsoft.PowerShell.Archive
$m = Get-Module Microsoft.PowerShell.Archive
$m.LogPipelineExecutionDetails = $true
# Complementos (PSSnapin)
$m = Get-PSSnapin Microsoft.PowerShell.Core
$m.LogPipelineExecutionDetails = $true
Anda juga boleh mendayakan atau melumpuhkan pengelogan ini mengikut dasar kumpulan menggunakan tetapan Dayakan Pengelogan Modul. Arahan tersebut membolehkan anda menyenaraikan nama modul dan pemalam, dengan kad bebas. Apabila arahan memaksa pengelogan untuk modul, sifat LogPipelineExecutionDetails ditetapkan kepada $true untuk semua sesi dan tidak boleh ditukar secara manual.
Laluan Dasar Kumpulan untuk konfigurasi ini:
Computer Configuration\ Administrative Templates\ Windows Components\ Windows PowerShell
User Configuration\ Administrative Templates\ Windows Components\ Windows PowerShell. Dasar pengguna diutamakan daripada dasar komputer, dan kedua-duanya mengatasi nilai sifat dalam modul dan pemalam.
Mengenai keselamatan dan pengauditan
Pengelogan Windows PowerShell bertujuan untuk memberikan keterlihatan operasi dan membantu dalam diagnostik. Ia bukan rekod yang direka untuk selamat mahupun untuk menyimpan data sensitif. Seperti log aplikasi lain dalam Windows, tujuannya adalah untuk dibaca dan berguna kepada pengguna.
Dalam banyak persekitaran, pengguna boleh membaca dan menulis ke log peristiwa. Pengguna yang berniat jahat boleh membaca peristiwa pada komputer tempatan atau jauh, menyuntik input palsu dan juga mengganggu penulisan itu sendiri.. Untuk keperluan audit yang ketat, kawalan tambahan mesti digunakan dan saluran acara selamat.
Get-EventLog: Sintaks, Parameter dan Contoh Penting
Cmdlet Get-EventLog mendapatkan semula peristiwa dan log daripada komputer tempatan atau jauh. Secara lalai ia menanyakan komputer tempatan, tetapi dengan -ComputerName anda boleh menyasarkan komputer lain. tanpa mendayakan jarak jauh PowerShell. Penting: Get-EventLog hanya berfungsi pada log klasik seperti Aplikasi, Sistem atau Keselamatan; untuk saluran moden, gunakan Get-WinEvent.
Nota keserasian yang perlu diingat: Get-EventLog dan Get-WinEvent tidak disokong dalam Windows PEJika anda bekerja dengan persekitaran prapemasangan, anda perlu mencari alternatif.
Contoh praktikal untuk kegunaan harian dengan Get-EventLog:
Senaraikan rekod yang ada
Get-EventLog -List
5 peristiwa terakhir daripada log Sistem
Get-EventLog -LogName System -Newest 5
Asal-usul teratas antara 1000 acara terbaharu
$events = Get-EventLog -LogName System -Newest 1000
$events | Group-Object -Property Source -NoElement | Sort-Object Count -Descending
Hanya ralat dalam Sistem
Get-EventLog -LogName System -EntryType Error
Tapis mengikut InstanceId dan Sumber
Get-EventLog -LogName System -InstanceId 10016 -Source DCOM
Rujuk berbilang peranti serentak
Get-EventLog -LogName System -ComputerName Server01,Server02,Server03. Ingat bahawa -ComputerName menyokong NetBIOS, IP atau FQDN, dan juga satu mata untuk pasukan tuan rumah.
Cari melalui teks dalam mesej
Get-EventLog -LogName System -Message *description*
Lihat semua sifat sesuatu acara
$a = Get-EventLog -LogName System -Newest 1
$a | Select-Object -Property *
Tapis mengikut sumber dan EventID, dan paparkan medan tertentu
Get-EventLog -LogName Application -Source Outlook | Where-Object { $_.EventID -eq 63 } | Select-Object Source,EventID,InstanceId,Message
Kumpulan mengikut pengguna
Get-EventLog -LogName System -UserName 'NT*' | Group-Object UserName -NoElement | Select-Object Count,Name
Tapis mengikut julat masa
$begin = Get-Date -Date '01/17/2019 08:00:00'
$end = Get-Date -Date '01/17/2019 17:00:00'
Get-EventLog -LogName System -EntryType Error -After $begin -Before $end. Parameter -Selepas dan -Sebelum mengehadkan julat masa tetapi mereka tidak muncul dalam output.
Parameter utama dan butiran berguna untuk diingat:
-Nama Log (diperlukan) menyokong kad bebas; -Senarai memaparkan rekod yang tersedia; -KomputerName menerima nama NetBIOS, IP atau FQDN; -Terbaru mengembalikan N peristiwa terkini; -Jenis Kemasukan tapis mengikut Ralat, Maklumat, FailureAudit, SuccessAudit atau Amaran; -Nama Pengguna y -Sumber menerima kad liar; -Mesej tapis mengikut teks; -InstanceId y -Indeks menerima senarai yang dipisahkan koma; -Selepas y -Sebelum ini terima DateTime; -AsBaseObject mengembalikan objek System.Diagnostics.EventLogEntry; -AsString mengembalikan rentetan dalam set -Senarai
Get-WinEvent lwn. Get-EventLog
Get-WinEvent ialah cmdlet moden untuk berurusan dengan log berdasarkan teknologi Windows Event Log yang diperkenalkan sejak Windows Vista. Menyokong saluran moden, pertanyaan XML XPath, penapis hashtable dan prestasi yang lebih baik dengan volum yang besar.
Manakala Get-EventLog ditinggalkan kepada balak klasik, Get-WinEvent disyorkan untuk senario semasa. Penapis biasa mengikut julat tarikh dan log boleh jadi:
Get-WinEvent -FilterHashtable @{ LogName = 'System'; StartTime = (Get-Date).AddDays(-30) }
Kelebihan hebat Get-WinEvent ialah pertanyaan lanjutannya (XPath atau FilterHashtable), serta keupayaan untuk membaca langganan dan log tersuai. Jika anda perlu mengeksport ke CSV atau XML, anda boleh paip ke Select-Object dan Export-Csv atau Export-Clixml untuk mempunyai struktur yang bersih dan boleh digunakan.
Eksport acara ke CSV, XML dan EVTX tanpa kehilangan data
Masalah biasa apabila mengeluarkan acara ke fail menggunakan Format-Table diikuti dengan Out-File: Format-Jadual memberikan output yang dimaksudkan untuk skrin dan boleh memotong lajur atau memotong mesejJika anda ingin mengeksport data, gunakan Select-Object dan Export-Csv untuk mendapatkan lajur yang lengkap.
Contoh eksport CSV bagi 7 hari terakhir log Keselamatan, dengan lajur dipilih dan tiada kerugian:
$desde = (Get-Date).AddDays(-7)
Get-WinEvent -FilterHashtable @{ LogName = 'Security'; StartTime = $desde } |
Select-Object TimeCreated,Id,LevelDisplayName,ProviderName,Message,UserId,MachineName |
Export-Csv -Path 'C:\temp\security-ultimos7dias.csv' -NoTypeInformation -Encoding UTF8. Jika anda masih mahukan teks biasa, lebih baik gunakan Out-String dengan lebar lebar dan kemudian Set-Content untuk mengelakkan luka.
# Alternativa a TXT sin truncado
a) Salida de tabla legible en archivo
Get-EventLog -LogName System -Newest 200 |
Format-Table TimeGenerated,EntryType,Source,EventID,Message -Wrap |
Out-String -Width 4096 |
Set-Content -Path 'C:\temp\system-200.txt' -Encoding UTF8
b) Exportación a XML de objetos (no .evtx)
Get-WinEvent -LogName Application -MaxEvents 500 |
Export-Clixml -Path 'C:\temp\application-500.xml'
Jika matlamat anda ialah fail .evtx asli, jangan cuba menciptanya dengan Out-Fail atau ubah hala: Fail .evtx hanya dijana oleh subsistem acara WindowsAlat yang disokong untuk mengeksport ke .evtx ialah wevtutil dengan pilihan epl.
Eksport 30 hari terakhir ke .evtx untuk Sistem, Keselamatan, Persediaan dan Aplikasi dengan satu folder bagi setiap komputer, mencipta direktori jika ia tidak wujud:
$computer = $env:COMPUTERNAME
$exportDir = ::Combine($env:PUBLIC, 'Desktop\AuditLogs-' + $computer)
if (-not (Test-Path $exportDir)) { New-Item -ItemType Directory -Path $exportDir | Out-Null }
$stamp = Get-Date -Format 'MM-dd-yyyy_HHmm'
wevtutil.exe epl System "$exportDir\$stamp`_SystemLog30days.evtx" '/q:*]]' /ow:true
wevtutil.exe epl Security "$exportDir\$stamp`_SecurityLog30days.evtx" '/q:*]]' /ow:true
wevtutil.exe epl Setup "$exportDir\$stamp`_SetupLog30days.evtx" '/q:*]]' /ow:true
wevtutil.exe epl Application "$exportDir\$stamp`_ApplicationLog30days.evtx" '/q:*]]' /ow:true. Pertanyaan XPath menggunakan timediff untuk menapis 30 hari terakhir dalam milisaat.
Satu lagi corak yang sangat praktikal adalah untuk melelaran melalui set log dan membina nama fail dengan pelayan dan cap waktu. Dengan pemasa kecil anda memvisualisasikan el tiempo keseluruhan proses Jika anda mengeksport volum yang besar:
$logArray = @('System','Security','Application','Setup')
$server = $env:COMPUTERNAME
$path = 'C:\WindowsEventLogs\'
if ($path -notmatch '.+?\\$') { $path += '\' }
if (-not (Test-Path -Path $path)) { New-Item -ItemType Directory -Path $path | Out-Null }
$tag = Get-Date -Format 'yyyyMMddHHmm'
$sw = ::StartNew()
foreach ($log in $logArray) {
$dest = $path + $server + '-' + $log + '-' + $tag + '.evtx'
Write-Host ('Extrayendo el log {0}' -f $log)
wevtutil epl $log $dest
# Para limpiar tras exportar: wevtutil cl $log
}
$sw.Stop(); '{0} segundos' -f (::Round($sw.Elapsed.TotalSeconds,2))
Jika anda bekerja dengan berbilang mesin serentak dan ingin menjana CSV bagi setiap mesin, baca senarai aset dan gunakan penapis masa. Elakkan Jadual Format | Corak Fail Luar semasa mengeksport data, gunakan Select-Object dan Export-Csv dengan pengekodan UTF-8.
$assetList = Get-Content -Path 'C:\temp\assetlist.txt'
$desde = (Get-Date).AddDays(-7)
foreach ($pc in $assetList) {
$dest = "C:\\temp\\$pc-security-7dias.csv"
Get-WinEvent -ComputerName $pc -FilterHashtable @{ LogName='Security'; StartTime=$desde } |
Select-Object TimeCreated,Id,LevelDisplayName,ProviderName,Message,UserId,MachineName |
Export-Csv -Path $dest -NoTypeInformation -Encoding UTF8
}
Write-Host 'Exportación completada'
Menyelesaikan masalah eksport log
Fail .evtx yang rosak: Ini biasanya berlaku apabila seseorang cuba menggunakan Out-File untuk mencipta .evtx. A .evtx bukan teks biasa, hanya wevtutil epl menjana fail yang sah. Ulangi eksport dengan utiliti yang betul.
Data terputus dalam CSV atau TXT: puncanya hampir selalu Format sebelum mengeksport, contohnya dengan Format-Table. Peraturan emas adalah untuk memilih sifat dengan Select-Object dan eksport dengan Export-CsvJika anda memerlukan jadual yang boleh dibaca, bergantung pada -Balut dan kawal lebar dengan Out-String -Width 4096.
Kebenaran tidak mencukupi dalam log Keselamatan: Membaca peristiwa keselamatan pada komputer jauh atau tempatan memerlukan keahlian dalam kumpulan istimewa (contohnya, Pentadbir Komputer). Jika Get-EventLog atau Get-WinEvent mengembalikan akses ditolak, semak keahlian dan arahan.
Prestasi: Sentiasa tapis pada sumber dengan -FilterHashtable apabila menggunakan Get-WinEvent. Elakkan mengambil semuanya dan menapis dengan Where-Object selepas itu, terutamanya untuk log bising seperti Keselamatan. Untuk Get-EventLog, gunakan -Terbaharu dan parameter penapis asli.
Persekitaran Windows PE: Tidak disokong oleh Get-EventLog dan Get-WinEvent. Jika anda berada dalam pra-penyerahan, pertimbangkan alatan tertentu atau kumpulkan selepas penggunaan dalam keseluruhan sistem.
Resepi rujukan cepat
Senaraikan semua rekod klasik yang tersedia
Get-EventLog -List
Kira peristiwa mengikut jenis dalam Sistem
Get-EventLog -LogName System | Group-Object EntryType -NoElement | Sort-Object Count -Desc
Cari acara dengan kata kunci dalam mesej
Get-EventLog -LogName Application -Message *timeout*
Acara berbilang pasukan secara selari
'Srv01','Srv02','Srv03' | ForEach-Object { Get-EventLog -LogName System -ComputerName $_ -Newest 100 }. Tambahkan Select-Object untuk mengawal lajur dan Export-Csv untuk berterusan keputusan pada cakera.
Dengan semua perkara di atas, anda kini mempunyai kriteria untuk memilih alat dan teknik: Get-EventLog untuk klasik, Get-WinEvent untuk moden dan wevtutil apabila anda mahukan EVTX. Dengan menggunakan penapis pada sumber, memilih sifat sebelum mengeksport, dan mengelakkan pra-pemformatan sebelum output, anda akan mencapai eksport yang boleh dipercayai, lengkap dan pantas secara tempatan dan jauh, dan anda akan dapat menjadualkan mereka dengan tugasan jadi anda tidak perlu risau tentangnya setiap bulan.
Penulis yang bersemangat tentang dunia bait dan teknologi secara umum. Saya suka berkongsi pengetahuan saya melalui penulisan, dan itulah yang akan saya lakukan dalam blog ini, menunjukkan kepada anda semua perkara yang paling menarik tentang alat, perisian, perkakasan, trend teknologi dan banyak lagi. Matlamat saya adalah untuk membantu anda mengemudi dunia digital dengan cara yang mudah dan menghiburkan.