获取 ClickOnce 程序的安装日期
本文关键字:安装 日期 程序 ClickOnce 获取 | 更新日期: 2023-09-27 18:35:32
我正在构建各种资产跟踪器。我已经在搜索注册表以获取所有软件标题、发布者、安装日期的列表,并且效果很好。 但是,使用 ClickOnce 安装的程序不会将安装日期存储在注册表中(至少我找不到)。
我知道我应该能够使用 WMI 来获取安装日期,但这非常慢。另外,根据这篇文章: 在系统中获取已安装的应用程序"如果您打算重复运行此查询,则使用 WMI Win32_Product 类是一个坏主意"
那么,如果不使用 WMI,如何获取 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。