获取ClickOnce计划的安装日期?

时间:2013-10-15 14:46:43

标签: c# clickonce

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

我知道我应该能够使用WMI来获取安装日期,但这非常慢。另外,根据这篇文章:Get installed applications in a system “如果您计划重复运行此查询,那么使用WMI Win32_Product类是一个坏主意”

因此,如果不使用WMI,我如何获得ClickOnce程序的安装日期?我知道这些信息是以某种方式提供的,因为日期在添加/删除程序中。

1 个答案:

答案 0 :(得分: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。 You need to call RegQueryInfoKey.