获取 ClickOnce 程序的安装日期

本文关键字:安装 日期 程序 ClickOnce 获取 | 更新日期: 2023-09-27 18:35:32

我正在构建各种资产跟踪器。我已经在搜索注册表以获取所有软件标题、发布者、安装日期的列表,并且效果很好。 但是,使用 ClickOnce 安装的程序不会将安装日期存储在注册表中(至少我找不到)。

我知道我应该能够使用 WMI 来获取安装日期,但这非常慢。另外,根据这篇文章: 在系统中获取已安装的应用程序"如果您打算重复运行此查询,则使用 WMI Win32_Product 类是一个坏主意"

那么,如果不使用 WMI,如何获取 ClickOnce 程序的安装日期? 我知道这些信息以某种方式可用,因为日期在添加/删除程序内。

获取 ClickOnce 程序的安装日期

当每个用户安装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;
    }

此方法返回注册表项,然后您可以获取"显示版本"键值:

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

更新

关于安装日期,请尝试获取注册表项的上次写入时间(获取"DisplayVersion"的上次写入时间是您需要的)。看起来没有托管包装器来获取它,所以使用 P/Invoke。您需要调用RegQueryInfoKey。