找回密码
 加入
搜索
查看: 1355|回复: 2

已解决

[复制链接]
发表于 2009-1-8 15:40:20 | 显示全部楼层 |阅读模式
以下代码用来读取 Windows 系统序列号,3.2.12 及以前版本读取正确,以后的版本(包括最新的 3.3)就不正确了,郁闷。。。


        Dim $Setkey = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "DigitalProductID")
        $Key = DecodeProductKey($Setkey)
        If $Key<>"" Then
                MsgBox(64,"SN",$Key)
        EndIf


Func DecodeProductKey($BinaryDPID) ;读取序列号
        Local $bKey[15]
        Local $sKey[29]
        Local $Digits[24]
        Local $Value = 0
        Local $hi = 0
        Local $n = 0
        Local $i = 0
        Local $dlen = 29
        Local $slen = 15
        Local $Result
        $Digits = StringSplit("BCDFGHJKMPQRTVWXY2346789", "")
        $BinaryDPID = StringMid($BinaryDPID, 105, 30)

        For $i = 1 To 29 Step 2
                $bKey[Int($i / 2) ] = Dec(StringMid($BinaryDPID, $i, 2))
        Next

        For $i = $dlen - 1 To 0 Step - 1
                If Mod(($i + 1), 6) = 0 Then
                        $sKey[$i] = "-"
                Else
                        $hi = 0
                        For $n = $slen - 1 To 0 Step - 1
                                $Value = BitOR(BitShift($hi, -8), $bKey[$n])
                                $bKey[$n] = Int($Value / 24)
                                $hi = Mod($Value, 24)
                        Next
                        $sKey[$i] = $Digits[$hi + 1]
                EndIf
        Next

        For $i = 0 To 28
                $Result = $Result & $sKey[$i]
        Next
        
EndFunc


[ 本帖最后由 新手上路 于 2009-1-18 21:12 编辑 ]
发表于 2009-1-8 16:28:44 | 显示全部楼层
新版用以下这个代码,在XP SP3 AU3 3.3.0.0下测试正确。


$key = RegRead("HKLM\SOFTWARE\MICROSOFT\Windows NT\CurrentVersion","DigitalProductId")
MsgBox(0,0,GetXPKey($key))
Func GetXPKey($binaryDPID)
    Local $bKey[15]
   Local $sKey[29]
   Local $Digits[24]
   Local $Value = 0
   Local $hi = 0
   local $n = 0
   Local $i = 0
   Local $dlen = 29
   Local $slen = 15
   Local $Result
   $Digits = StringSplit("BCDFGHJKMPQRTVWXY2346789","")
   $binaryDPID = stringmid($binaryDPID,107,30)
   
   For $i = 1 to 29 step 2
       $bKey[int($i / 2)] = dec(stringmid($binaryDPID,$i,2))
   next

   For $i = $dlen -1 To 0 Step -1
       If Mod(($i + 1), 6) = 0 Then
           $sKey[$i] = "-"
       Else
           $hi = 0
           For $n = $slen -1 To 0 Step -1
               $Value = Bitor(bitshift($hi ,- 8) , $bKey[$n])
               $bKey[$n] = int($Value / 24)
               $hi = mod($Value , 24)
           Next
           $sKey[$i] = $Digits[$hi +1]
       EndIf

   Next
   For $i = 0 To 28
       $Result = $Result & $sKey[$i]
   Next

   Return $Result
EndFunc
 楼主| 发表于 2009-1-8 18:51:05 | 显示全部楼层
感谢。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-19 19:49 , Processed in 0.073413 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表