mhgd 发表于 2008-8-13 22:49:40

怎么读取系统安装日期(已知:Delphi源码)

怎么读取系统安装日期与开机时间呢?我知道用注册表,但是我不知道怎么读取这样的类型。请指点我!

NO.1   作者: ljmanage
系统安装时间   
function   DateInstallWindows   (var   DateInstall:   TDateTime):Boolean;   
var   
            RegDate:   TRegistry;   
            Buffer:   Integer;   
begin   
Result:=False;   
RegDate   :=   TRegistry.Create;   
try   
          RegDate.RootKey   :=   HKEY_LOCAL_MACHINE;   
          if   Win32Platform   =   VER_PLATFORM_WIN32_NT   Then   
                  Begin   
                  if   RegDate.OpenKey(Software\Microsoft\Windows   NT\CurrentVersion,   True)   
                  then   
                              Begin   
                              RegDate.ReadBinaryData(InstallDate,Buffer,   sizeof   (Buffer));   
                              DateInstall:=StrToDateTime   (FormatDateTime(dd/mm/yyyy   hh:nn,   FileDateToDateTime(Buffer)));   
                              Result:=True;   
                              end   
                  end   
          else   
                  if   RegDate.OpenKey(Software\Microsoft\Windows\CurrentVersion,   True)   
                  then   
                        Begin   
                        RegDate.ReadBinaryData(FirstInstallDateTime,Buffer,   sizeof   (Buffer));   
                        DateInstall:=StrToDateTime   (FormatDateTime(dd/mm/yyyy   hh:nn,   FileDateToDateTime(Buffer)));   
                        Result:=True;   
                        end   
      finally   
          RegDate.CloseKey;   
          RegDate.Free;   
      end;   
end;   
   
2.用法   
   
procedure   TForm1.BitBtn2Click(Sender:   TObject);   
var   
      TheDate:   TDateTime;   
begin   
if   DateInstallWindows   (TheDate)   Then   Label1.Caption:=DateTimeToStr   (TheDate);   
end;   

以上应该是Delphi代码,能否转换成au3,高手指教!!!

可以看出数据是保存在:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion   InstallDate中,关键是如何转换成正常日期来显示!!!

[ 本帖最后由 mhgd 于 2008-8-14 11:42 编辑 ]

sanhen 发表于 2008-8-14 00:49:29

$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$strComputer = "localhost"
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem ", "WQL", _
                                          $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

If IsObj($colItems) then
   For $objItem In $colItems
   
      $InstallDate=WMIDateStringToDate($objItem.InstallDate)
   
   Next
Else
   Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_OperatingSystem" )
Endif
MsgBox(0,"InstallDate",$InstallDate)

Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 7, 2) & "/" & _
            StringMid($dtmDate, 5, 2) & "/" & StringLeft($dtmDate, 4) _
             & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
EndFunc   ;==>WMIDateStringToDate

redapple2008 发表于 2008-8-14 00:51:17

楼上的高人,现在还没有休息吗?

sanhen 发表于 2008-8-14 01:03:54

革命仍未成功,继续通宵作战

bob 发表于 2008-8-14 11:32:33

原帖由 sanhen 于 2008-8-14 01:03 发表 http://www.autoitx.com/images/common/back.gif
革命仍未成功,继续通宵作战
:face (36):
太感到人了!

mhgd 发表于 2008-8-14 11:43:59

感谢老大帮我解题,只是能否不使用WMI,而直接从注册表中读取出来呢???

sanhen 发表于 2008-8-14 12:22:50

非常抱歉,昨晚没有查到注册表安装时间的算法。刚查到的。

http://support.microsoft.com/?id=232227


#Include <Date.au3>
$InstallDate = RegRead("HKLM\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\", "InstallDate")
$InstallDate = _DateAdd( 's',$InstallDate, "1970/01/01 00:00:00")
MsgBox(64, "测试", "系统安装时间是:" & $InstallDate)



查安装时间的方法多得是。还有其他两种方法CMD和API的,略过不说了。
只要搞清楚时间的算法原理,注册表的是最简单的

mhgd 发表于 2008-8-15 00:08:14

怪不得我怎么转换都不对呢,原来要加上个基数啊,太感谢你了,用wmi太复杂了,还是注册表比较简单一点,

基数应该是:1970/01/01 00:00:00 ,但我用systeminfo.exe查出来比较会缺8小时,基数是:1970/01/01 08:00:00时,与systeminfo.exe查出来的分秒不缺了。也不知道为什么。。。   可能是中美时间差吧。。。

[ 本帖最后由 mhgd 于 2008-8-15 12:26 编辑 ]

meteorln 发表于 2008-10-21 11:00:44

:face (2): 我直接用的systeminfo,现在又学习了一招

番茄 发表于 2008-11-1 15:01:59


$InstallDate = _DateAdd( 's',$InstallDate, "1970/01/01 08:00:00")

与cmd输入systeminfo查出来一致

songtao 发表于 2009-9-16 11:27:26

好东西,学习了。

zdpcc 发表于 2010-1-8 10:26:12

不错,学习了,收藏备用

非典男人 发表于 2010-1-12 14:18:37

学习 啦 谢谢 以上的能人

zdpcc 发表于 2010-8-13 01:49:34

谢谢提供,又学到了,呵呵
页: [1]
查看完整版本: 怎么读取系统安装日期(已知:Delphi源码)