0

私はある種の資産トラッカーを構築しています。私はすでにレジストリを検索して、すべてのソフトウェア タイトル、発行元、インストール日のリストを取得していますが、うまく機能しています。ただし、ClickOnce でインストールされたプログラムは、インストール日をレジストリに保存しません (少なくとも、私が見つけることはできません)。

WMI を使用してインストール日を取得できるはずですが、これは非常に遅いです。また、この投稿による と、「システムにインストールされたアプリケーションを取得する 」「このクエリを繰り返し実行する予定がある場合、WMI Win32_Product クラスを使用することはお勧めできません」

では、WMI を使用せずに、ClickOnce プログラムのインストール日を取得するにはどうすればよいでしょうか? 日付が [プログラムの追加と削除] 内にあるため、何らかの形で情報を入手できることはわかっています。

4

1 に答える 1

0

ClickOnce アプリケーションはユーザーごとにインストールされるため、レジストリのパスをたどることで、アンインストール情報 (ウィザードが表示するアプリ) を見つけることができます。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\5f7eb300e2ea4ebf

この「アンインストール」には一意のハッシュ サブキーがあります。アプリを見つけるには、これらのキーを反復処理し、たとえば次のように DisplayName でフィルター処理できます。

private RegistryKey GetUninstallRegistryKeyByProductName(string productName)
{
        var subKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall");
        if (subKey == null)
            return null;
        foreach (var name in subKey.GetSubKeyNames())
        {
            var application = subKey.OpenSubKey(name, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.QueryValues | RegistryRights.ReadKey | RegistryRights.SetValue);
            if (application == null)
                continue;
            foreach (var appKey in application.GetValueNames().Where(appKey => appKey.Equals("DisplayName")))
            {
                if (application.GetValue(appKey).Equals(productName))
                    return application;
                break;
            }
        }
        return null;
    }

このメソッドは RegistryKey を返し、「DisplayVersion」キー値を取得できます。

var key = GetUninstallRegistryKeyByProductName("myApp");
var version = key.GetValue("DisplayVersion");

アップデート

インストール日については、レジストリ キーの最終書き込み時刻を取得してみてください ("DisplayVersion" の最終書き込み時刻を取得する必要があります)。これを取得するためのマネージ ラッパーがないように見えるので、P/Invoke を使用します。RegQueryInfoKey を呼び出す必要があります。

于 2013-10-17T21:36:05.527 に答える