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 回答