[C#] 呼叫 PowerShell 取得 Windows Event 4624 的 JSON 資料

2023-06-01

最近,因為一些事情我需要 去檢測關於 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://cynthiachuang.github.io/Solve-that-Mandarin-Characters-Will-Be-Garbled-When-Using-Git-Command-in-Powershell/

https://hackercat.org/windows/powershell-cannot-be-loaded-because-the-execution-of-scripts-is-disabled-on-this-system

https://blog.darkthread.net/blog/ps-list-logon-events/

https://blog.darkthread.net/blog/ps-pipeline-exe-encoding/






當麻許的超技八 2014 | Donma Hsu Design.