为什么Win32_Product.InstallDate2在使用WMI时始终返回null?

时间:2017-10-16 02:08:32

标签: datetime vbscript windows-installer wmi

  

更新:如果您想在您的语言环境中帮助快速测试启动PowerShell 按住Windows键,点击R,释放Windows键,输入" powershell"然后按OK )并运行这个   命令 - ( InstallDate2列是空的吗?请告诉我们您的看法。):

Get-WmiObject Win32_Product | Format-Table -Property InstallDate, InstallDate2, Name

我应该首先说这个问题对我来说并不重要,但我感到困惑。我正在访问WMI对象 Win32_Product ,并且有两个与日期相关的属性: InstallDate InstallDate2

  • InstallDate 似乎是没有时间部分的DateTime值的字符串表示形式。截止UTC格式的排序。示例:20170819。该字段是字符串值,不是DateTime格式
  • InstallDate2 应该是真实的DateTime格式,但对于我所有系统(Windows 7,Windows 10,各种版本)上的所有Win32_Product项,它始终为null。

使用 WMIExplorer.exe 我看到了InstallDate的这个描述:" ...不推荐使用InstallDate属性,而是使用了DateD而不是DateTime的InstallDate2属性。串。新实现应该使用InstallDate2属性。"

如上所述,我在所有机器上都返回null,所以我假设InstallDate2没有正确实现,但后来我发现了这篇文章:Working with Software Installations。本文清楚地显示InstallDate2返回WMI DateTime(缺少时间部分?):InstallDate2 = 20060506000000.000000-000

当我看到它在其他系统上运行时,我想知道在我的所有系统上可能导致这个InstallDate2 null值的原因是什么?我想到了一些可能性(一个比下一个更远的可能性)也许):

  • 操作系统问题?我无法访问较旧的操作系统,但我在Windows 7和Windows 10系统的几个不同版本(主页,ulitmate等等)上看到了null。也许它适用于XP和更老的?我发现这不太可能。
  • 区域设置问题?我在挪威语中。这会影响事情吗?我曾尝试简短地更改Windows 10系统上的语言环境,但它有一些语言包问题,结果是一样的。
  • 域名(网络)问题?是否可以想象工作组中的计算机的工作方式与属于域的计算机的工作方式不同?
  • 补丁级别?最近的Windows Update可能在WMI中发生了哪些变化?
  • 还有什么可以想象会影响到这个?

问题的第二部分(除了InstallDate2的null值的原因是什么)。我为InstallDate返回的字符串(字符串格式日期):20170819。我假设这只是Universal Time Coordinate (UTC) format的一个版本。它是一种与语言环境无关的格式?当我读到CIM_DATETIME时,似乎就是这样。

我尝试用零填充剩余的切断日期字符串并将其传递给SWbemDateTime scripting object,它似乎有效,但这确实闻起来像一个"解决方案"。看起来并不可靠:

Set dateTime = CreateObject("WbemScripting.SWbemDateTime")
dateTime.Value = "20170601000000.000000+000"
MsgBox dateTime.Year
MsgBox dateTime.UTC

显示2017年,UTC为0。有了这样一个"解决方案"我显然真的想让InstallDate2 DateTime字段正常工作,所以我得到了一个合适的Datetime。

所有的冗长,基本上是一个两部分的问题

  1. 什么可能导致 Win32_Product.InstallDate2 始终报告null 似乎只在我的系统上?
  2. InstallDate 返回的短字符串 - 是否为与语言环境无关的格式
    • 由于我在挪威语区域,看看看起来像英式风格,看起来似乎是这样吗? 由于该字段只是一个字符串,因此内容基本上可以是"任何"虽然
    • 如果其他区域设置中的某人可以验证格式返回为:Win32_Product.InstallDate = yyyymmdd,那就太棒了。
    • 阅读CIM_DATETIME似乎表明字符串与语言环境无关(即使被切断)。
  3. 如果你想测试,最快的方法可能是使用wbemtest.exe(或者更好的PowerShell,如果你的盒子上有它可用 - 正如JosefZ在下面的评论中提到的那样):

    • 启动wbemtest.exe按住Windows键,点击R,释放Windows键,输入" wbemtest.exe"然后按确定)。
    • 点击"连接" ,然后确定(命名空间默认为root \ cimv2),然后点击" 连接"试。
    • 点击" 查询"并输入此WQL命令:SELECT Name,InstallDate2 FROM Win32_Product并单击"使用" (或等同的)。
    • 双击返回的任何条目,并在中间列表框中选中InstallDate2(向下滚动)。

1 个答案:

答案 0 :(得分:0)

在我看来,你不会得到一个完整的日期时间。唯一可用的信息来自MsiGetProductInfo(... INSTALLPROPERTY_INSTALLDATE ....)。这种格式是YYYYMMDD。你只需要获取数据,因为这似乎就是全部。请注意,INSTALLPROPERTY_INSTALLDATE的文档说明只有在安装产品后没有其他服务的情况下才是安装日期,所以看起来您甚至不能依赖它是产品安装的日期。

请参阅Detecting the time when the program was installed

我怀疑获得产品安装时间的最佳方法是使用MsiGetProductInfo(Ex)获取本地包路径... INSTALLPROPERTY_LOCALPACKAGE ...并获取缓存的MSI的CreationDate。