[C#] 呼叫 PowerShell 取得 Windows Event 4624 的 JSON 資料
最近,因為一些事情我需要 去檢測關於 Windows Event 4624 的事件 ,剛好 黑暗執行緒的一篇文章,我就想說
可以透過這方法來做到,不過黑大是使用 PowerShell ,這東西對我來說是一個完全完全陌生的領域,不過我就想黑大都分享了
那我可以使用黑大的分享,然後我透過程式端去抓就可以達到我的需求,果然是一個及時雨
中間遇到一些問題,我就在文章記錄一下,這範例我會去撈取過去 12 小時內 4624 也就是 Windows 被登入的 event 代碼,主要透過 C# 去呼叫黑大寫的 PS
不過這中間我修改過,我將他轉成 JSON,這樣我在程式端會比較好處理,這裡面我就記錄一些比較麻煩的地方
1. 顯示中文問題,基本上我是基於 這篇文章改中文問,不然會一直出現亂碼
我在 PowerShell 下 $PROFILE 得到一個指定讀取的路徑並加在該ps 中寫
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [Text.UTF8Encoding]::UTF8
然後,主要 run 的 ps1 主要存檔時選擇具有 BOM 的 UTF8
這樣中文就正常了
2. 我主要思維不想自己去寫撈取 Windows Event 的東西,所以我的思維就是直接呼叫 黑大的 ps code ,然後得到答案後不就完美所以我參考了了這篇程式碼
https://gist.github.com/SQLJana/1738dff1b151e2412240067167076e7a
但是我拿掉一些我不需要的部分,感謝開源前輩的貢獻
這時候你會遇到 using System.Management.Automation; 系統竟然不認識,這時候我網路上找到保哥這篇文章
https://blog.miniasp.com/post/2014/05/09/Call-Windows-PowerShell-Cmdlets-from-CSharp-program
去修改專案檔,增加 <Reference Include="System.Management.Automation" />
就可以了,這點覺得很奇怪,不過原因我也沒有細查了
3. 修改 黑大的程式碼,主要我改變時間,我改撈取 12 小時候並且,最後我轉成 JSON ,改動幅度不大
4. 接下來你執行得時候,需要有高的管理權限,所以你必須要在專案中加入程式的執行授權,在 app.manifest
中加入 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 這時候才可以
5.主程式碼的部分
我就放在 GITHUB 上面有需要的就自取吧,我主要是用 .Net Framework 4.8.1 寫的,沒有跨平台需求我就沒有用 .Net 6 了
Github : https://github.com/donma/WindowsEventLab
參考網站:
https://blog.miniasp.com/post/2014/05/09/Call-Windows-PowerShell-Cmdlets-from-CSharp-program
https://gist.github.com/SQLJana/1738dff1b151e2412240067167076e7a
https://blog.darkthread.net/blog/ps-list-logon-events/
https://blog.darkthread.net/blog/ps-pipeline-exe-encoding/
標籤:
.Net
,
C#
,
PowerShell
-- Yesterday I wrote down the code. I bet I could be your hero. I am a mighty little programmer. 如果這篇文章有幫助到您,簡單留個言,或是幫我按個讚,讓我有寫下去的動力...