windows - 添加/删除程序在哪里提取 "Installed On"列的数据?

标签 windows date vbscript wmi addremoveprograms

我正在使用 VBScript 复制 Windows 7/8 添加删除程序小程序。我已获得包含所有正确条目的脚本,但我无法使其包含 Windows 显示的所有正确附加信息。

例如:Windows 显示带有日期的“安装时间”列。在某些情况下,它从相关的注册表项中获取这些信息,例如:

HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\InstallDate
HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\InstallDate
HKUS\USER - SID\Software\Microsoft\Windows\CurrentVersion\Uninstall\InstallDate

实际上很少有键具有 InstallDate 值,Windows 总是填充此列。我已经设法从 WMI 中获取了大部分缺失的日期:

 ("SELECT * FROM Win32_Product Where Description = " & "'" & strName & "'" & "")
for each objSoftware in colSoftware
Date = objSoftware.InstallDate

这仅提供 MSI 安装的应用程序的日期。

我在想,也许 Windows 根据 Program Files/ProgramData 文件日期“猜测”了日期,但我已经尝试手动更改它们,但它没有反射(reflect)在添加/删除中。我想弄清楚 Windows 是如何提取这个日期的。我注意到 CCleaner 可以无误地重现添加/删除,所以这个信息在某处可用。我已经筋疲力尽地寻找它。

最佳答案

经过一番折腾后,我确定 Windows 添加/删除程序至少从三个可能的位置获取“安装日期”:

  • 对于 MSI 安装的应用程序,它从 WIN32_Product 获取日期(迄今为止最常用的方法)

  • 对于非 MSI 应用程序,它会在相应的注册表卸载键中查找 InstallDate 值(示例:HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome)

  • 对于没有 InstallDate 的非 MSI 应用程序,Windows 会查找写入卸载 key 的最后日期,并将该日期用于“安装日期”。

正是最后这个方法让我难住了这么久。这意味着每当更新缺少 InstallDate 值的非 MSI 程序,并且修改卸载 key 中的版本号时,您会注意到“安装日期”也会更新并显示该程序的外观刚刚安装。

一个例子:HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player Plugin

如果您的 Flash Player 插件安装不是基于 MSI,那么您可以进入此 key 并将版本从 11.8.800.94 修改为 11.8.800.93,然后您的添加/删除会将“安装日期”更改为今天。

关于windows - 添加/删除程序在哪里提取 "Installed On"列的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18679441/

相关文章:

c++ - 尝试创建计划任务以在 win7 上使用 C++、Task Scheduler 1.0 运行一次

c++ - 使用异步 I/O 和 IOCP 实现回声服务器的最佳方法是什么?

sql - 从年/月而不是日期字段中选择滚动日期范围

Windows 脚本 (VBS) 始终使应用程序保持打开状态

java - 64 位 Windows 中与 Access 数据库的 ODBC 连接

windows - 使用 golang 创建硬链接(hard link)

Java 日历时区

algorithm - 不规则间隔——在哪里划线?

windows-7 - windows.location.href 使用 vbscript 在 IE10 上抛出错误

vbscript - 使用 AppActivate 更改事件窗口