Acer监控序列号

时间:2015-01-16 18:51:04

标签: windows python-3.x inventory edid

我试着让Acer监视器的序列号查看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

问题在于" Serie"不是真正的序列号(Acer监视器序列号有22个字符,看起来像#34; ETL480201781700F4B396L")
有一种方法可以使用" Serie"来构建真实的序列号。以及识别显示器的SNID 以下是两个Acer监视器的示例:

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

任何人都知道如何获取此信息?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

例如,我们的EDID字符串如下所示:

  

00ffffffffffff0004723a03c4fe603324170103682f1e78ca9265a655559f280d5054bfef80714f8140818081c0810095000101010126399030621a274068b03600da281100001c000000fd00374c1e5011000a202020202020000000fc0042323236574c0a202020202020000000ff004c58565341303031383531300a007b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我们想要的序列号是这样的: LXVSA0013360FEC48510

序列号LXVSA001的前8个字符在&00; 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

当我说&#39; position&#39;我的意思是将EDID字符串作为数组并从0开始索引。 它们很难找到,因为它们的顺序相反。

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