Серийный номер монитора Acer

Вопрос:

Я пытаюсь получить серийный номер монитора 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 символа и выглядит как “ETL480201781700F4B396L”)
Существует способ создания реального серийного номера с помощью “Серии” и 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

Кто-нибудь знает, как получить эту информацию?

Благодарю!

Лучший ответ:

Acer предоставляет серийный номер после флага 000000ff00 но средняя часть серийного номера скрыта ранее в строке EDID.

Так, например, наша строка EDID выглядит так:

00ffffffffffff0004723a03c4fe603324170103682f1e78ca9265a655559f280d5054bfef80714f8140818081c0810095000101010126399030621a274068b03600da281100001c000000fd00374c1e5011000a202020202020000000fc0042323236574c0a202020202020000000ff004c58565341303031383531300a007b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Серийный номер, который мы хотим, это: LXVSA0013360FEC48510

Первые 8 символов серийного номера LXVSA001 закодированы как шестнадцатеричная строка сразу после флага “000000ff00”.

Последние 4 символа серийного номера 8510 кодируются как шестнадцатеричная строка после этих первых 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 закодирована как 4 строки ранее в EDID.

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 должны быть расположены в виде 4 отдельных 2 символьных строк в местах 30, 28, 26 и 24 вашей строки idid. Я не могу проверить это, потому что у меня нет полного IDID.

Оцените статью
TechArks.Ru
Добавить комментарий