我正在构建各种资产跟踪器。我已经在注册表中搜索所有软件标题,发布者,安装日期的列表,并且它工作得很好。但是,使用ClickOnce安装的程序不会将安装日期存储在注册表中(至少不是我能找到的)。
我知道我应该能够使用WMI来获取安装日期,但这非常慢。另外,根据这篇文章:Get installed applications in a system “如果您计划重复运行此查询,那么使用WMI Win32_Product类是一个坏主意”
因此,如果不使用WMI,我如何获得ClickOnce程序的安装日期?我知道这些信息是以某种方式提供的,因为日期在添加/删除程序中。
答案 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.