Вопрос:
Я пытаюсь получить серийный номер монитора Acer, смотрящего в реестр Windows. Я разбираю реестр с помощью этого кода в Python 3:
import winreg from winreg import HKEY_LOCAL_MACHINE subKey = «SYSTEMCurrentControlSetEnumDISPLAY» k = winreg.OpenKey(HKEY_LOCAL_MACHINE, subKey) with winreg.OpenKey(HKEY_LOCAL_MACHINE, subKey) as k: «»»» Open the key ‘HKLMSYSTEMCurrentControlSetEnumDISPLAY’ 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 + «nn») 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.