自前でEDRアプリを制作したい-C#で、PC名MacアドレスIP取得、WindowsDefenderが有効か?WindowsUpdate状況を確認する

未分類

本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^

WUApiLibをnugetする

WUApiLibとは

WUApiLibは、Windows Update APIの一部であり、Windows Updateサービスとやり取りするためのCOMインターフェースを提供します。これにより、プログラムからWindows Updateの検索、ダウンロード、インストール、そしてクエリなどが行えるようになります。簡単に言うと、Windows Updateに関する操作をプログラムで自動化するためのライブラリです。

nugetパッケージの管理で

nugetしたパッケージを参照する

WUAPI 2.0 Type Library をチェック

C#のコード

namespace ConsoleEDR01
{
    class Program
    {
        static void Main(string[] args)
        {
            UpdateSession updateSession = new UpdateSession();
            IUpdateSearcher updateSearcher = updateSession.CreateUpdateSearcher();

            try
            {
                ISearchResult searchResult = updateSearcher.Search("IsInstalled=1");

                Console.WriteLine("Installed Updates:");
                foreach (IUpdate update in searchResult.Updates)
                {
                    Console.WriteLine($"Title: {update.Title}, KB Article: {update.KBArticleIDs[0]}, Installed Date: {update.LastDeploymentChangeTime}");
                }
            }
            catch (COMException ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }

            // デバッガーがプロセスにアタッチされているか?
            if (System.Diagnostics.Debugger.IsAttached)
            {
                Console.WriteLine("続行するには何かキーを押してください . . .");
                Console.ReadKey();
            }
        }
    }
}

実行結果

コンソールアプリ上ではこのように表示されます

Installed Updates:
Title: Windows Defender Antivirus マルウェア対策プラットフォームの更新プログラム - KB4052623 (Version 4.18.2001.10), KB Article: 4052623, Installed Date: 2020/05/01 0:00:00
Title: Microsoft Defender Antivirus マルウェア対策プラットフォームの更新プログラム - KB4052623 (バージョン 4.18.24080.9) - 現在のチャネル (広範), KB Article: 4052623, Installed Date: 2024/09/25 0:00:00
Title: 悪意のあるソフトウェアの削除ツール x64 - v5.129 (KB890830), KB Article: 890830, Installed Date: 2024/10/08 0:00:00
Title: 2024-10 .NET Framework 3.5 および 4.8.1 の累積的な更新プログラム (x64 向け Windows 11, version 23H2 用) (KB5044033), KB Article: 5044033, Installed Date: 2024/10/08 0:00:00
Title: Microsoft Defender Antivirus のセキュリティ インテリジェンス更新プログラム - KB2267602 (バージョン 1.419.510.0) - 現在のチャネル (広範), KB Article: 2267602, Installed Date: 2024/10/15 0:00:00
Title: 2023-11 x64 ベース システム用 Windows 11 Version 23H2 更新プログラム (KB4023057), KB Article: 4023057, Installed Date: 2023/11/16 0:00:00
Title: 2024-10 x64 ベース システム用 Windows 11 Version 23H2 の累積更新プログラム (KB5044285), KB Article: 5044285, Installed Date: 2024/10/08 0:00:00
続行するには何かキーを押してください . . .

Microsoft Defenderが有効になっているかどうか

Nugetでパッケージを必要としない方法で考えるとイベントログから正常性を確認するのがよさそう

Microsoft-Windows-Windows Defender/Operational ログから

イベントID: 1150 エンドポイント保護クライアントは正常に稼働しています。

イベントID: 5000 Microsoft Defender ウイルス対策 リアルタイム保護スキャンが、マルウェアおよび他の望ましくない可能性のあるソフトウェアに対して有効になりました。

イベントID: 1116,1006 1116: ウイルス検出イベント, 1006: リアルタイム保護イベント

を取得表示するソースコード

using System.Diagnostics.Eventing.Reader;

        static void Main(string[] args)
        {
            //コンピュータ名を取得する
            {
                string computerName = Environment.MachineName;
                Console.WriteLine("Computer Name: " + computerName);
            }

            //Microsoft Windows Defenderのログを取得する
            string logName = "Microsoft-Windows-Windows Defender/Operational";
            EventLogQuery logQuery = new EventLogQuery(logName, PathType.LogName);


            //一番新しい日付のイベント1150を取得する:エンドポイント保護クライアントは正常に稼働しています。
            try
            {
                EventLogReader logReader = new EventLogReader(logQuery);
                EventRecord latestEvent = null;

                for (EventRecord eventDetail = logReader.ReadEvent(); eventDetail != null; eventDetail = logReader.ReadEvent())
                {
                    if (eventDetail.Id == 1150)
                    {
                        if (latestEvent == null || eventDetail.TimeCreated > latestEvent.TimeCreated)
                        {
                            latestEvent = eventDetail;
                        }
                    }
                }

                if (latestEvent != null)
                {
                    Console.WriteLine($"Event ID: {latestEvent.Id}");
                    Console.WriteLine($"Time Created: {latestEvent.TimeCreated}");
                    Console.WriteLine($"Provider Name: {latestEvent.ProviderName}");
                    Console.WriteLine($"Message: {latestEvent.FormatDescription()}");
                    Console.WriteLine();
                }
                else
                {
                    Console.WriteLine("No event with ID 1150 found.");
                }
            }
            catch (EventLogNotFoundException e)
            {
                Console.WriteLine($"The event log '{logName}' was not found: {e.Message}");
            }

            //一番新しい日付のイベント5000を取得する:Microsoft Defender ウイルス対策 リアルタイム保護スキャンが、マルウェアおよび他の望ましくない可能性のあるソフトウェアに対して有効になりました。
            try
            {
                EventLogReader logReader = new EventLogReader(logQuery);
                EventRecord latestEvent = null;

                for (EventRecord eventDetail = logReader.ReadEvent(); eventDetail != null; eventDetail = logReader.ReadEvent())
                {
                    if (eventDetail.Id == 5000)
                    {
                        if (latestEvent == null || eventDetail.TimeCreated > latestEvent.TimeCreated)
                        {
                            latestEvent = eventDetail;
                        }
                    }
                }

                if (latestEvent != null)
                {
                    Console.WriteLine($"Event ID: {latestEvent.Id}");
                    Console.WriteLine($"Time Created: {latestEvent.TimeCreated}");
                    Console.WriteLine($"Provider Name: {latestEvent.ProviderName}");
                    Console.WriteLine($"Message: {latestEvent.FormatDescription()}");
                    Console.WriteLine();
                }
                else
                {
                    Console.WriteLine("No event with ID 5000 found.");
                }
            }
            catch (EventLogNotFoundException e)
            {
                Console.WriteLine($"The event log '{logName}' was not found: {e.Message}");
            }

            //重要なセキュリティログを取得
            try
            {
                EventLogReader logReader = new EventLogReader(logQuery);


                for (EventRecord eventDetail = logReader.ReadEvent(); eventDetail != null; eventDetail = logReader.ReadEvent())
                {
                    // ここで特定のウイルス検出イベントIDをチェックします
                    if (eventDetail.Id == 1116 || eventDetail.Id == 1006 ) // 1116: ウイルス検出イベント, 1006: リアルタイム保護イベント
                    {
                        Console.WriteLine($"Event ID: {eventDetail.Id}");
                        Console.WriteLine($"Time Created: {eventDetail.TimeCreated}");
                        Console.WriteLine($"Provider Name: {eventDetail.ProviderName}");
                        Console.WriteLine($"Message: {eventDetail.FormatDescription()}");
                        Console.WriteLine();
                    }
                }
            }
            catch (EventLogNotFoundException e)
            {
                Console.WriteLine($"The event log '{logName}' was not found: {e.Message}");
            }
}

実行するとこんな感じ

PC名、MAC Address、IP Addressを取得する

            //コンピュータ名を取得する
            {
                string computerName = Environment.MachineName;
                Console.WriteLine("Computer Name: " + computerName);
            }

            //有線LANネットワークが有効な時に有線LANのNIC-MACアドレスを表示する
            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                // ネットワークインターフェースがイーサネットであるかどうかを確認
                if (nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet && nic.OperationalStatus == OperationalStatus.Up)
                {
                    Console.WriteLine($"Name: {nic.Name}");
                    Console.WriteLine($"Description: {nic.Description}");
                    Console.WriteLine($"MAC Address: {nic.GetPhysicalAddress()}");
                    Console.WriteLine();
                }
            }

            //無線LANネットワークが有効な時に無線LANのNIC-MACアドレスを表示する
            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                // ネットワークインターフェースが無線LANであるかどうかを確認
                if (nic.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && nic.OperationalStatus == OperationalStatus.Up)
                {
                    Console.WriteLine($"Name: {nic.Name}");
                    Console.WriteLine($"Description: {nic.Description}");
                    Console.WriteLine($"MAC Address: {nic.GetPhysicalAddress()}");
                    Console.WriteLine();
                }
            }

            //取得しているIPアドレスを表示します、LoopBackを除外します
            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (nic.OperationalStatus == OperationalStatus.Up)
                {
                    foreach (UnicastIPAddressInformation ip in nic.GetIPProperties().UnicastAddresses)
                    {
                        if (ip.Address.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(ip.Address))
                        {
                            Console.WriteLine($"Interface: {nic.Name}");
                            Console.WriteLine($"IP Address: {ip.Address}");
                            Console.WriteLine();
                        }
                    }
                }
            }
タイトルとURLをコピーしました