Windowsのインベントリ取得

組織で使用する端末はウィンドウズが多いと思います。
情報システム部が有る組織では、許可されたアプリケーションのみ使用可能という事も有るでしょう。
定期的にインベントリ調査アプリを実行して結果を集約して怪しいアプリを使っている人がいないかどうか検査する場合も有ります。ただ、不正アプリと言っても何をもって不正なアプリと判断するかは組織によって異なる可能性が有りますし、実際、不正アプリを検出するソフトってぱっと見PCでは見かけません(知らないだけなのかも)。
そこで、ウィンドウズOSのインストール済みアプリを検出するソフトを作ってみました。


インベントリ調査アプリ

一部のコードスニペットですが、比較的簡単に取得出来ます

        // ****************************************************
        // 64ビットアプリ情報取得
        // ****************************************************
        RegistryKey localKey64 = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
        if (localKey64 != null)
        {
            uninstall_path = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            RegistryKey key = localKey64.OpenSubKey(uninstall_path);

            foreach(string subkey in key.GetSubKeyNames())
            {
                RegistryKey appkey = key.OpenSubKey(subkey);
                if (appkey != null)
                {
                    Inventory_Software inv = new Inventory_Software();

                    inv.DisplayName = appkey.GetValue("DisplayName")?.ToString() ?? "";
                    inv.RegKey = @"HKEY_LOCAL_MACHINE\" + uninstall_path;
                    inv.Publisher = appkey.GetValue("Publisher")?.ToString() ?? "";
                    inv.InstallDate = appkey.GetValue("InstallDate")?.ToString() ?? "";
                    inv.InstallPath = appkey.GetValue("InstallLocation")?.ToString() ?? "";
                    if (appkey.GetValue("EstimatedSize") != null)
                    {
                        int work = 0;
                        if (int.TryParse(appkey.GetValue("EstimatedSize").ToString(), out work) == true)
                        {
                            work /= 1024;
                            CultureInfo jpCulture = new CultureInfo("ja-JP");
                            string jpFormatted = work.ToString("N0", jpCulture);
                            inv.Size = jpFormatted + " MB";

                        }
                    }
                    inv.DisplayVersion = appkey.GetValue("DisplayVersion")?.ToString() ?? "";

                    if (inv.DisplayName != "")
                    {
                        invs.Add(inv);
                    }
                }
            }
        }

アプリ名、メーカー、インストール日、インストールパス、インストールサイズ、バージョン情報なんかを取得します。

        Dictionary<String, String> sys = new Dictionary<string, string>();

        // ****************************************************
        // OS情報
        // ****************************************************
        OperatingSystem os = Environment.OSVersion;

        // コンピュータ名
        sys.Add("OS:コンピュータ名", Environment.MachineName);

        // OS名
        sys.Add("OS:OS名", RuntimeInformation.OSDescription);

        // OSバージョン
        sys.Add("OS:OSバージョン", os?.VersionString ?? "不明");

        // フレームワーク
        sys.Add("OS:フレームワーク", RuntimeInformation.FrameworkDescription);

        // ビット数
        sys.Add("OS:ビット数", RuntimeInformation.OSArchitecture.ToString());

        // ****************************************************
        // ユーザ情報
        // ****************************************************
        // ドメイン
        sys.Add("USER:ドメイン", Environment.UserDomainName);

        // ログインユーザ名
        sys.Add("USER:ログインユーザ名", Environment.UserName);

コンピュータ名、OS名、バージョン、ユーザ情報などを取得します

アプリ一覧です

コンピュータやOS、ユーザ情報です


サービスアプリ化して、起動時や特定日などに実行してサーバに送って集約し、例えば管理サーバではアプリとバージョンなどでホワイトリストを作成、ホワイトとして未登録アプリが有る場合はユーザや管理者に通知して対応を促すなどすれば良いかと思います。

2024年11月5日 手塚幹人

関連記事

コメント

この記事へのトラックバックはありません。

TOP
TOP