更新:如果您想在您的语言环境中帮助快速测试。 启动PowerShell (按住Windows键,点击R,释放Windows键,输入" powershell"然后按OK )并运行这个 命令 - ( InstallDate2列是空的吗?请告诉我们您的看法。):
Get-WmiObject Win32_Product | Format-Table -Property InstallDate, InstallDate2, Name
我应该首先说这个问题对我来说并不重要,但我感到困惑。我正在访问WMI对象 Win32_Product ,并且有两个与日期相关的属性: InstallDate 和 InstallDate2 。
20170819
。该字段是字符串值,不是DateTime格式。使用 WMIExplorer.exe 我看到了InstallDate的这个描述:" ...不推荐使用InstallDate属性,而是使用了DateD而不是DateTime的InstallDate2属性。串。新实现应该使用InstallDate2属性。"
如上所述,我在所有机器上都返回null,所以我假设InstallDate2没有正确实现,但后来我发现了这篇文章:Working with Software Installations。本文清楚地显示InstallDate2返回WMI DateTime(缺少时间部分?):InstallDate2 = 20060506000000.000000-000
。
当我看到它在其他系统上运行时,我想知道在我的所有系统上可能导致这个InstallDate2 null值的原因是什么?我想到了一些可能性(一个比下一个更远的可能性)也许):
问题的第二部分(除了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。
所有的冗长,基本上是一个两部分的问题:
Win32_Product.InstallDate = yyyymmdd
,那就太棒了。如果你想测试,最快的方法可能是使用wbemtest.exe
(或者更好的PowerShell,如果你的盒子上有它可用 - 正如JosefZ在下面的评论中提到的那样):
wbemtest.exe
(按住Windows键,点击R,释放Windows键,输入" wbemtest.exe"然后按确定)。SELECT Name,InstallDate2 FROM Win32_Product
并单击"使用" (或等同的)。答案 0 :(得分:0)
在我看来,你不会得到一个完整的日期时间。唯一可用的信息来自MsiGetProductInfo(... INSTALLPROPERTY_INSTALLDATE ....)。这种格式是YYYYMMDD。你只需要获取数据,因为这似乎就是全部。请注意,INSTALLPROPERTY_INSTALLDATE的文档说明只有在安装产品后没有其他服务的情况下才是安装日期,所以看起来您甚至不能依赖它是产品安装的日期。
请参阅Detecting the time when the program was installed
我怀疑获得产品安装时间的最佳方法是使用MsiGetProductInfo(Ex)获取本地包路径... INSTALLPROPERTY_LOCALPACKAGE ...并获取缓存的MSI的CreationDate。