2015-01-16 247 views
2

我试着获取宏基显示器的序列号,看着windows注册表。 我解析注册表与此代码在Python 3:宏基显示器序列号

import winreg 
from winreg import HKEY_LOCAL_MACHINE 

subKey = "SYSTEM\CurrentControlSet\Enum\DISPLAY" 
k = winreg.OpenKey(HKEY_LOCAL_MACHINE, subKey) 

with winreg.OpenKey(HKEY_LOCAL_MACHINE, subKey) as k: 
    """" 
     Open the key 'HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY' 
     to get the info of all connected monitors 
    """ 
    i = 0 
    while True: 
     try: 
      with winreg.OpenKey(k, winreg.EnumKey(k, i)) as sk: 
       j = 0 
       while True: 
        try: 
         with winreg.OpenKey(sk, winreg.EnumKey(sk, j)) as ssk: 
          l = 0 
          while True: 
           try: 
            if (winreg.EnumKey(ssk, l) == "Control"): 
             try: 
              with winreg.OpenKey(ssk, "Device Parameters") as sssk: 
               strEDID = str(winreg.EnumValue(sssk, 0)[1]) 
               try: 
                modelo = strEDID[strEDID.index("\\x00\\x00\\x00\\xfc") + len("\\x00\\x00\\x00\\xfc\\x00"):].split("\\")[0] 
                serie = strEDID[strEDID.index("\\x00\\x00\\x00\\xff") + len("\\x00\\x00\\x00\\xff\\x00"):].split("\\")[0] 
               except: 
                modelo = "Not Found" 
                serie = "Not Found" 

               print ("Modelo:", modelo) 
               print ("Serie:", serie, "\n") 

               fo = open("salTest.txt", "a") 
               fo.write(modelo + "\n") 
               fo.write(serie + "\n\n") 
               fo.close() 

             except OSError: 
              print ("Error") 
             break 
            else: 
             l += 1 
           except OSError: 
            break 
         j += 1 
        except OSError: 
         break 
      i += 1 
     except OSError: 
      break 

至于结果我得到的cmd窗口的输出是这样的:

Modelo: AL1716 
Serie: L4802017396L 

的问题是,“意甲” ISN真正的序列号(一个Acer显示器序列号有22个字符,看起来像“ETL480201781700F4B396L”)
有一种方法可以用“Serie”和SNID来构建真正的序列号以识别显示器。
这里是二宏基显示器的一个例子:

S/N ORIGINAL:   ETL48020178170 (0F4B)396L |  # ETL480201781700F4B396L 
------------------------------------------------------------------------------------ 
SNID:        8170 (0F4B)=03915 | 39 # 81700391539 
S/N FROM SCRIPT:   L4802017   396L |  # L4802017396L 



S/N ORIGINAL:   ETL48020178170 (2C98)396L |  # ETL480201781702C98396L 
------------------------------------------------------------------------------------ 
SNID:        8170 (2C98)=11416 | 39 # 81701141639 
S/N FROM SCRIPT:   L4802017   396L |  # L4802017396L 

任何人知道如何得到这个信息?

谢谢!

+0

为什么不直接看显示器的背面?我不知道Windows会导入每一块硬件的序列号(假设它甚至可以访问并且有效)并将其存储在注册表中。虽然Windows可以做很多事情也可以这么说,但我猜... – twalberg

+0

@twalberg - 我怀疑OP是作为企业的IT部门工作的。企业喜欢通过管理脚本跟踪尽可能多的硬件。 – selbie

+0

正如@selbie所说,我需要通过网络从许多计算机收集硬件信息......宏基显示器的这个问题是我现在唯一的问题。谢谢。 –

回答

1

Acer提供000000ff00标志后的序列号,但序列号的中间部分在EDID字符串中较早隐藏。

因此,例如,我们的EDID字符串看起来是这样的:

00ffffffffffff0004723a03c4fe603324170103682f1e78ca9265a655559f280d5054bfef80714f8140818081c0810095000101010126399030621a274068b03600da281100001c000000fd00374c1e5011000a202020202020000000fc0042323236574c0a202020202020000000ff004c58565341303031383531300a007b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我们想要的序列号是: LXVSA0013360FEC48510

序列号LXVSA001的前8个字符是“000000ff00”标志后立即编码为十六进制字符串。

序列号8510的最后4个字符在此前8个字符后被编码为十六进制字符串。

000000ff00 4c|58|56|53|41|30|30|31|38|35|31|30|0a|  <-- EDID (hex) 
      L X V S A O 0 1 8 5 1 0 (linefeed) <-- ascii 
      (^^^^ first part ^^^^^^)(last part) 

现在棘手的中间部分3360fec4被编码为EDID中较早的4个字符串。

33是在位置30 60是28位 fe是在位置26 c4是在位置24

00ffffffffffff0004723a03 
position 24 -> c4 
position 26 -> fe 
position 28 -> 60 
position 30 -> 33 
24170103682f1e78ca9265a655559f etc 

当我说“位置”我的意思是取EDID字符串作为阵列和指数从0. 他们很难找到,因为他们是在相反的顺序。

在您的示例中,您的序列号81700F4B的缺少部分应位于idid字符串的位置30,28,26和24处的4个单独的2个字符字符串中。我无法测试,因为我没有完整的IDID。

+0

它完全工作... [这里](http://pastebin.com/4NyuQkTb)是完整的代码,如果你想看到它... Thx !!!!!! –