【问题标题】:How do I find the install time and date of Windows?如何找到 Windows 的安装时间和日期?
【发布时间】:2008-10-04 16:36:15
【问题描述】:

这听起来有点像一个疯狂的问题,但我如何才能(希望通过 API/注册表项)找出 Windows 的安装时间和日期?

到目前为止,我能想到的最好办法是查看 C:\Windows 中的各种文件并尝试猜测......但这并不是一个很好的解决方案。

【问题讨论】:

    标签: windows installation


    【解决方案1】:

    TLDR

    重要提示如果 Windows 是使用磁盘映像“安装”,这两种方法都会失败。

    方法 1 在 windows 尚未升级到新的主要版本(例如 windows 10 到 windows 11)时有效。您执行命令systeminfo 并查找以“原始安装日期”(或您的本地语言中的类似内容)开头的行。您可以通过查询 WMI 和查看注册表来获得相同的版本。如果 Windows 升级到新的主要版本,不幸的是,此方法会为您提供新主要版本的安装日期。下面是一个通过 PowerShell 运行 systeminfo 来检查版本的示例:

    systeminfo | sls "original"
    

    方法 2 即使在重大更新之后,这似乎也能正常工作。您可以通过检查文件system.ini 的创建时间来获得安装日期,该文件似乎保持不变。例如使用 PowerShell:

     (Get-Item "C:\Windows\system.ini").CreationTime
    

    详情

    另一个符合“code-challenge”的问题:这里有一些源代码可执行文件来回答这个问题,但它们并不完整。
    你会找到一个任何人都可以在他/她的计算机上执行的 vb 脚本,并获得预期的结果吗?


    systeminfo|find /i "original" 
    

    会给你实际的日期...而不是秒数;)

    但是(警告),如the 2021 comments Salman AAutoMattTick 中所述

    如果 Windows 已更新到较新版本,这似乎给出了重新安装 Windows 的日期


    作为Sammy commentsfind /i "install" 提供的超出您的需要。
    这仅在语言环境为英语时才有效:它需要与语言匹配。
    对于瑞典语,这将是“ursprungligt”和“ursprüngliches”对于德语。

    Andy Gaugethe comments求婚:

    减少5个字符
    systeminfo|find "Original"
    

    在 Windows PowerShell 脚本中,您只需键入:

    PS > $os = get-wmiobject win32_operatingsystem
    PS > $os.ConvertToDateTime($os.InstallDate) -f "MM/dd/yyyy" 
    

    通过使用 WMI (Windows Management Instrumentation)

    如果你不使用WMI,你必须读取然后转换注册表值:

    PS > $path = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion'
    PS > $id = get-itemproperty -path $path -name InstallDate
    PS > $d = get-date -year 1970 -month 1 -day 1 -hour 0 -minute 0 -second 0
    ## add to hours (GMT offset)
    ## to get the timezone offset programatically:
    ## get-date -f zz
    PS > ($d.AddSeconds($id.InstallDate)).ToLocalTime().AddHours((get-date -f zz)) -f "MM/dd/yyyy"
    

    本文的其余部分为您提供了访问相同信息的其他方式。选择你的毒药;)


    在 VB.Net 中会给出类似的东西:

    Dim dtmInstallDate As DateTime
    Dim oSearcher As New ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
    For Each oMgmtObj As ManagementObject In oSearcher.Get
        dtmInstallDate =
            ManagementDateTimeConverter.ToDateTime(CStr(oMgmtO bj("InstallDate")))
    Next
    

    Autoit(一种 Windows 脚本语言)中,应该是:

    ;Windows Install Date
    ;
    $readreg = RegRead("HKLM\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\", "InstallDate")
    $sNewDate = _DateAdd( 's',$readreg, "1970/01/01 00:00:00")
    MsgBox( 4096, "", "Date: " & $sNewDate )
    Exit
    

    在 Delphy 7 中,这将是:

    Function GetInstallDate: String;
    Var
      di: longint;
      buf: Array [ 0..3 ] Of byte;
    Begin
      Result := 'Unknown';
      With TRegistry.Create Do
      Begin
        RootKey := HKEY_LOCAL_MACHINE;
        LazyWrite := True;
        OpenKey ( '\SOFTWARE\Microsoft\Windows NT\CurrentVersion', False );
        di := readbinarydata ( 'InstallDate', buf, sizeof ( buf ) );
    //    Result := DateTimeToStr ( FileDateToDateTime ( buf [ 0 ] + buf [ 1 ] * 256 + buf [ 2 ] * 65535 + buf [ 3 ] * 16777216 ) );
    showMessage(inttostr(di));
        Free;
      End;
    End;
    

    作为替代方案,CoastN 建议 in the comments

    由于 system.ini-file 在典型的 Windows 部署中保持不变,您实际上可以使用以下 oneliner 获取安装日期:

    (PowerShell): (Get-Item "C:\Windows\system.ini").CreationTime
    

    【讨论】:

    • 我找到了原因。这是因为我的 Windows 不是英文的。 :)
    • 使用systeminfo|find /i "original" 仅过滤“原始安装日期”。如果您使用“安装”作为字符串,您将获得比您需要的更多信息。此外,如果语言环境不是英语,那么这可能不起作用。它需要匹配语言。对于瑞典语,这将是 "ursprungligt" 和 "ursprüngliches" 对于德语。
    • 对我来说 systeminfo|find /i "original" 于 2017 年 6 月 30 日返回,这必须是一些 Windows 更新,因为我已经拥有这台机器大约 4 年了。
    • @Tim 我确认并看到与您相同(太近)的日期。所以stackoverflow.com/a/44539474/6309 可能更符合您的要求。
    • 显示我是两周前安装的系统,但实际上是一两年。看来这是最后一次大升级的日期。
    【解决方案2】:

    regedit.exe 中转至:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\InstallDate
    

    它以自 1970 年 1 月 1 日以来的秒数给出。(注意:对于 Windows 10,此日期将是最后一次功能更新的安装日期,而不是原始安装日期。)

    要将该数字转换为可读的日期/时间,只需将十进制值粘贴到此Unix Time Conversion online tool 的“UNIX 时间戳:”字段中。

    【讨论】:

    • 太好了,有没有什么特别的地方让你去获取这些信息,或者你只是知道吗?
    • 效果很好,除非 Windows 是使用磁盘映像安装的。有没有办法检查用户个人资料的创建来解决这个问题?
    • 不能反映最新的 servicepack /update 安装日期(即当前版本,而不是原始版本的安装时间。
    • 我认为它给出了最后一次 Windows 更新日期,而不是系统安装日期。
    • 我的 Windows 7 安装没有在该注册位置显示 InstallDate,它的 SP1。
    【解决方案3】:

    我们在这里有足够的答案,但我想投入我的 5 美分。

    在我之前的安装之上,我在10/30/2015 上安装了 Windows 10,并在 04/14/2017 上安装了 Creators Update。我之前的答案中描述的所有方法都为我提供了 Creators Update 的安装日期。

    我设法找到了几个文件的创建日期与我的 Windows 10 的真实(干净)安装日期相匹配:

    • C:\Windows

    • C:\


    顺便说一句,在 C:\ 和 C:\windows 中获取 10 个最旧(通过创建)文件的简单方法是在管理 powershell 会话上运行这两个命令:

    dir -Force C:\ | sort -Property creationtime  | select -Property name, creationtime -First 10
    dir -Force C:\windows | sort -Property creationtime  | select -Property name, creationtime -First 10
    

    【讨论】:

    • 比其他答案更好,但是映像部署怎么样?
    • 这肯定更接近正确答案;其他解决方案不再适用于 Windows 10 升级。但是,此处列出的 5 个文件/文件夹中没有一个在我的系统上具有正确的日期(有些较晚,有些实际上较早)。但是,我在我的系统上找到了正确日期的 1 个文件和 2 个文件夹:C:\Windows\hbcikrnl.ini、C:\Windows\symbols\ 和 C:\Windows\CSC\。因此,如果您知道大概的时间,请转到 C:\Windows\,显示系统系统文件,按日期排序,然后找到合适的内容。
    • 对于我的 Windows 10 system.ini,BOOTNXT 和 bootmgr 的日期正确。 Win.ini 和 $Recycle.Bin 的日期更新。
    • system.ini 的日期在我的 Windows 7 和 2008 机器上没有意义,看来安装源中创建的时间戳正在安装时被复制。 C:\pagefile.sys 的时间戳正确。
    【解决方案4】:

    打开命令提示符,输入“systeminfo”并按回车键。您的系统可能需要几分钟才能获取信息。在结果页面中,您将找到“系统安装日期”条目。那是windows安装的日期。此过程适用于XP、Win7和win8。

    【讨论】:

    • 请注意,您必须是管理员才能执行此操作。
    • 在 Windows 7 上,这给出了一个“原始安装日期”条目,由于某种原因是 11.1.2002,这显然是不正确的 :(
    【解决方案5】:

    如何找出 Windows 7 的安装日期/时间:

    看看这个……

    • 开始>输入CMD
    • 输入系统信息

    就是这样;然后您可以看到有关您的机器的所有信息;很简单的方法

    【讨论】:

      【解决方案6】:

      想知道您 PC 的操作系统安装日期吗?这是查找您的 PC 操作系统安装(或上次升级)的日期和时间的快速简便方法。

      打开命令提示符(开始->运行->输入cmd->回车)并运行以下命令

      系统信息 |查找 /i "安装日期"

      几秒钟后,您将看到安装日期

      【讨论】:

      • 在您安装主要服务包之前,它会反映该日期
      【解决方案7】:

      在 Powershell 中运行命令:

      systeminfo | Select-String "Install Date:"
      

      【讨论】:

      • Select-String 需要 Windows PowerShell 版本 > 3.0 更好地使用find /i
      【解决方案8】:

      Windows 10 操作系统还有另一个注册表子键,这个在 SYSTEM hive 文件中:

      Computer\HKEY_LOCAL_MACHINE\SYSTEM\Setup\
      

      此处的安装日期信息是原始计算机操作系统的安装日期/时间。它还会告诉您更新何时开始,即

       Computer\HKEY_LOCAL_MACHINE\SYSTEM\Setup\Source OS (Updated on xxxxxx)."
      

      这当然可能不是更新结束的时候,用户可能会在提示时选择关闭而不是重新启动,等等......

      更新实际上可以在不同的日子完成,并且

      Computer\HKEY_LOCAL_MACHINE\SYSTEM\Setup\Source OS (Updated on xxxxxx)"
      

      将反映开始更新的日期/时间。

      【讨论】:

        【解决方案9】:

        我发现 c:\pagefile.sys 的创建日期在大多数情况下是相当可靠的。使用这个命令可以轻松获取(假设Windows安装在C:):

        dir /as /t:c c:\pagefile.sys
        

        “/as”指定“系统文件”,否则找不到。 '/t:c' 将时间字段设置为显示'creation'。

        【讨论】:

        • 这将给出页面文件的创建日期,这与操作系统本身的安装日期完全无关。它可以出于多种原因重新创建,如果您真的想要,甚至可以对其进行篡改。这不是一个可靠的方法。
        • 它不是“完全不相关的”,因为它是在初始安装期间创建的。因此,除非在某个时候故意重新创建或删除它,否则在“大多数情况下”,创建日期将与初始安装日期相同,因为它会在升级过程中持续存在。是的,它不是 100% 可靠的,但它既快速又简单,而且我猜想在更多情况下是准确的。绝对比这里的许多答案更重要。
        • 您可以随时重新创建该文件,如果方法不能保证 100% 的结果正确,那么没有人可以真正依赖它。
        • 对我来说,与所有其他答案相比,这给出了最准确的日期。如果 pagefile.sys 在某个时候被删除、移动到另一个分区或磁盘,或者您有疑问,您可以检查 System Volume Information 文件夹的日期。
        【解决方案10】:

        HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\InstallDate 和 systeminfo.exe 生成 wrong date

        UNIX 时间戳的definition 与时区无关。 UNIX 时间戳定义为自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来经过的秒数,不包括闰秒。

        换句话说,如果您将计算机安装在华盛顿州西雅图并搬到纽约,则 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\InstallDate 将不会反映这一点。这是错误的日期,它不存储最初安装计算机的时区。

        这样做的效果是,如果你在运行这个程序的时候改变了时区,日期就会出错。您必须重新运行可执行文件,以便它考虑时区更改。

        但您可以从 WMI Win32_Registry 类中获取时区信息。

        InstallDate 采用 UTC 格式 (yyyymmddHHMMSS.xxxxxx±UUU),根据 Microsoft TechNet article“使用 WMI 处理日期和时间”,其中 xxxxxx 是毫秒,±UUU 是与格林威治标准时间不同的分钟数。

         private static string RegistryInstallDate()
            {
        
                DateTime InstallDate = new DateTime(1970, 1, 1, 0, 0, 0);  //NOT a unix timestamp 99% of online solutions incorrect identify this as!!!! 
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Registry");
        
                foreach (ManagementObject wmi_Windows in searcher.Get())
                {
                    try
                    {
                        ///CultureInfo ci = CultureInfo.InvariantCulture;
                        string installdate = wmi_Windows["InstallDate"].ToString(); 
        
                        //InstallDate is in the UTC format (yyyymmddHHMMSS.xxxxxx±UUU) where critically
                        // 
                        // xxxxxx is milliseconds and       
                        // ±UUU   is number of minutes different from Greenwich Mean Time. 
        
                        if (installdate.Length==25)
                        {
                            string yyyymmddHHMMSS = installdate.Split('.')[0];
                            string xxxxxxsUUU = installdate.Split('.')[1];      //±=s for sign
        
                            int year  = int.Parse(yyyymmddHHMMSS.Substring(0, 4));
                            int month = int.Parse(yyyymmddHHMMSS.Substring(4, 2));
                            int date  = int.Parse(yyyymmddHHMMSS.Substring(4 + 2, 2));
                            int hour  = int.Parse(yyyymmddHHMMSS.Substring(4 + 2 + 2, 2));
                            int mins  = int.Parse(yyyymmddHHMMSS.Substring(4 + 2 + 2 + 2,  2));
                            int secs  = int.Parse(yyyymmddHHMMSS.Substring(4 + 2 + 2 + 2 + 2, 2));
                            int msecs = int.Parse(xxxxxxsUUU.Substring(0, 6));
        
                            double UTCoffsetinMins = double.Parse(xxxxxxsUUU.Substring(6, 4));
                            TimeSpan UTCoffset = TimeSpan.FromMinutes(UTCoffsetinMins);
        
                            InstallDate = new DateTime(year, month, date, hour, mins, secs, msecs) + UTCoffset; 
        
                        }
                        break;
                    }
                    catch (Exception)
                    {
                        InstallDate = DateTime.Now; 
                    }
                }
                return String.Format("{0:ddd d-MMM-yyyy h:mm:ss tt}", InstallDate);      
            }
        

        【讨论】:

        • UNIX 时间戳的定义确实包括时区 UTC。如果计算机在同一天纽约时间下午 6:00 和西雅图时间下午 3:00 安装,则它们将具有相同的 UNIX 时间戳,因为它们是在同一时间 UTC 安装的。如果您于 2018 年 4 月 1 日下午 3:00 在西雅图安装并移动到纽约,然后从 UTC 转换为您的本地时间,它将显示 2018 年 4 月 1 日下午 6:00 并且是正确的,因为它是 6当您在西雅图安装时,纽约时间:00 PM。
        • 谢谢 jla,我在帖子中并不清楚。当您在程序运行时动态更改时区时,将不会反映时区更改。您必须重新启动程序才能使时区生效。这与 Powershell 的行为相同。
        • InstallDate 返回应用当前时区的本地时间,以及+XXX 形式的时区。当时区改变时,安装日期和时区也会改变。如果 UTC 的安装日期是 2000-01-01T12:00:00Z。安装日期为 20000101120000.000000+000。将时区设置为 UTC+5,它变为 20000101170000.000000+300。使用上面的代码时,时区会被添加两次。要获取 UTC 日期,应将“InstallDate =”行更改为:InstallDate = new DateTime(year, month, date, hour, mins, secs, msecs, DateTimeKind.Utc) - UTCoffset;
        【解决方案11】:

        使用 WMIC 确定 Windows 安装日期

        wmic os 获取安装日期

        【讨论】:

        • 这可能只是读取 InstallDate 注册表项并有同样的问题;它会随着构建更新而改变。
        【解决方案12】:

        PowerShell 非常简单的方法:

        (Get-CimInstance -Class Win32_OperatingSystem).InstallDate
        

        摘自:https://www.sysadmit.com/2019/10/windows-cuando-fue-instalado.html

        【讨论】:

        • 这似乎是最简单的方法。 :) 谢谢。
        【解决方案13】:

        使用规范。它在操作系统部分显示安装日期。 http://www.piriform.com/speccy

        【讨论】:

        • 不是编程解决方案。如果有某种 Powershell(例如)可以与之交互的接口,请列出它。
        【解决方案14】:

        您还可以检查系统驱动器中的任何文件夹,例如“windows”和“程序文件”。右键单击文件夹,单击属性并在常规选项卡下检查文件夹的创建日期。

        【讨论】:

        • 虽然有效 - 这不是编程解决方案
        • @Matt He 为您提供 Natural Lenguaje 中的算法,所以只需将其复制到人类设备中! :D
        • 在较新版本的 Windows 中,使用基于映像的安装(.WIM 文件),创建日期是 Microsoft 创建映像的时间,而不是操作系统安装在特定计算机上的时间。跨度>
        【解决方案15】:

        在运行命令中 写 "MSINFO32" 并回车 它将显示与系统相关的所有信息

        【讨论】:

        • 除安装时间外的所有信息。 Windows 7 SP1。
        【解决方案16】:

        您可以简单地检查 Windows 文件夹的创建日期(右键单击它并检查属性) :)

        【讨论】:

          【解决方案17】:

          在尝试了各种方法后,我发现系统卷的NTFS卷创建时间可能是最好的代理。虽然有工具可以检查这一点(请参阅this link),但我想要一种没有额外实用程序的方法。我确定了“C:\System Volume Information”的创建日期,似乎在各种情况下都检查出来了。

          一行 PowerShell 获取它是:

          ([DateTime](Get-Item -Force 'C:\System Volume Information\').CreationTime).ToString('MM/dd/yyyy')
          

          【讨论】:

            【解决方案18】:

            WindowsKey + R 并输入cmd

            在命令窗口输入:

            systeminfo | find /i "Original"
            

            (对于旧版本的 Windows,请输入全部大写的“ORIGINAL”)。

            【讨论】:

            • 有人知道为什么投反对票吗?为我工作,由于某种原因它可能不准确吗?也许在投反对票时解释一下
            • @russelrillema 最后一个主要的服务包覆盖了这个日期。
            • 如果您使用的是 Windows 10 v1809,请转到设置 > 系统 > 关于。找到 Windows 规范,那里有一个名为“安装在”的字段。 (注意:不确定它是否适用于旧版本的 Windows)
            【解决方案19】:

            您可以使用 PowerShell 做到这一点:

            Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\' -Name InstallDate |
                Select-Object -Property @{n='InstallDate';e={[DateTime]::new(1970,1,1,0,0,0,0,'UTC').AddSeconds($_.InstallDate).ToLocalTime()}}
            

            【讨论】:

              【解决方案20】:

              试试这个 powershell 命令:

              Get-ChildItem -Path HKLM:\System\Setup\Source* | 
               ForEach-Object {Get-ItemProperty -Path Registry::$_} | 
                   Select-Object ProductName, ReleaseID, CurrentBuild, @{n="Install Date"; e={([DateTime]'1/1/1970').AddSeconds($_.InstallDate)}} | 
                       Sort-Object "Install Date"
              

              【讨论】:

              • 几乎是真的,应该注意更多,因为这考虑到构建更新会改变 HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion 中的密钥,但由于源操作系统需要两者结合如果系统从未真正更新过(还),则密钥甚至都不存在,并且还会丢失最后一次构建更新的日期
              猜你喜欢
              • 2015-03-10
              • 1970-01-01
              • 2022-09-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-04-18
              • 2015-08-14
              相关资源
              最近更新 更多