Получить ключ продукта Windows 8 с материнской платы

12

Мой новый ноутбук поставлялся с предустановленной Windows 8. Наивно, как и я, я только отформатировал жесткий диск и установил старый добрый Ubuntu. Теперь я хочу снова установить Windows 8 для двойной загрузки, но у меня нет DVD, и для загрузки ISO-образа нужен ключ продукта. Этот ключ больше не на задней панели ноутбука, а где-то на материнской плате.

Есть ли способ восстановить ключ продукта с материнской платы с помощью Ubuntu?

Грегор Вебер
источник

Ответы:

16

Обычно производители ОЕМ предварительно загружают ключ в ПЗУ в электронном виде. Windows определит это и автоматически активирует вашу установку. Поэтому, как правило, вам не нужно знать этот код. Тем не менее, вы можете увидеть некоторые следы этого, используя

sudo dmidecode

перечислены как OEM-specific Types, закодированы / зашифрованы, что может содержать его. Основные OEM-производители, такие как HP и Dell, используют это. Узнайте больше на веб-сайтах Windows; это не то место. Единственная деталь, которую я помню, это то, что требуется OEM-версия установочного диска Windows (т.е. не для розничной продажи).

gertvdijk
источник
Я помню, как использовал dmidecode на Lenovo Thinkpad в прошлом, но кажется, что на этом Lenovo Ideapad он нигде не содержит лицензионного ключа. В конце концов я нашел это, /sys/firmware/acpi/tables/MSDMкак упоминал Чак Р. в другом ответе ниже.
Люк
23

Другой способ, который не требует просмотра тонны вывода:

sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echo

acpidump создает дамп таблицы (по умолчанию в шестнадцатеричном формате), но опция -b указывает ему выводить необработанные данные. Поскольку нам нужна только последняя часть таблицы, перенаправьте вывод в dd, но пропустите ненужный мусор. Наконец, добавьте эхо в конце, чтобы сделать его удобным для терминала = D

acpidump -t MSDM тоже будет работать, но ключ разбит на несколько строк, что затруднит его копирование.


Обновление благодаря Лекенштейну:

Новые версии, acpidumpпоставляемые с Ubuntu, работают не так, как описано выше. Флаг -b вызывает acpidumpзапись в файл при любых обстоятельствах, поэтому альтернативным методом является использование команды

sudo tail -c+57 /sys/firmware/acpi/tables/MSDM

Законный установщик Windows 8 должен автоматически определить ключ в ACPI и продолжить установку со встроенным ключом.

Следует отметить, однако, что я использовал этот метод, чтобы попытаться установить Win8 на виртуальную машину, используя мой собственный ключ продукта, но он автоматически деактивировался, сказав, что ключ продукта использовался. Таким образом, он мало полезен во всей реальности. Поскольку ключи Win8 OEM предназначены для привязки к этому конкретному компьютеру, вы попадете в кирпичную стену, если попросите Microsoft отменить регистрацию ключа, чтобы вы могли использовать его в виртуальной машине, не говоря уже о другом компьютере.

Единственный способ использовать ключ - это если вы никогда не загружались в Win8 с самого начала или не были подключены к сети. Тем не менее, если вашей ВМ / новому компьютеру когда-либо будет разрешено подключение к сети, он автоматически зарегистрирует ключ, что сделает вашу фактическую установку непригодной для использования.

Чак Р
источник
Просто пробовал это, и команда выше отключила одного из персонажей. Я использовал, sudo acpidump -b -t MSDM | dd bs=1 skip=56 2>/dev/null;echoи я получил полный ключ.
Эндрю С
Вы правы, извините за это. Обновление моего ответа.
Чак Р
1
-bВариант специфичен для acpidumpинструмента в комплекте с деревом ядра. Более новые версии Ubuntu поставляются с другим acpidumpинструментом (из iasl), который имеет разные опции. Я не мог проверить эту команду, но она должна работать: sudo acpidump -n HPET | tail -n+2 | xxd -r | head -c+57. Альтернативный метод:sudo tail -c+57 /sys/firmware/acpi/tables/MSDM
Лекенштейн
@Lekensteyn Я тоже это заметил недавно, когда разговаривал по телефону с MS. Если вы укажете опцию -b, то по какой-то причине по умолчанию она столкнется с файлом. Интересно, есть ли способ пометить, что труба будет уничтожена, когда на ней больше нет данных ... хотя это еще одна тема для другого дня. Ваша первая команда не сработала для меня, однако вторая была просто в порядке. Я обновлю свой ответ, чтобы включить его =)
Чак Р
1
Использовал обновленную версию для Ubuntu 16.04 LTS: "sudo tail -c + 57 / sys / firmware / acpi / tables / MSDM" Может подтвердить, что я получил ключ Windows от ноутбука Samsung просто отлично =)
Valross.nu
9
 sudo tail -c+57 /sys/firmware/acpi/tables/MSDM

Это дало мне ключ продукта моего OEM Windows 8 на ноутбуке MSI.

ViliusK
источник
3

Вы можете использовать этот код, который также работает, если вышеприведенный код не работает для вас, или вы просто хотите увидеть шестнадцатеричный вывод с вашим ключом. Это похоже на благословение шестнадцатеричного двоичного редактора. Windows будет иметь свой ключ в обычном формате HAN50-0L00M-4D31T-CR4ZY. 5 букв или цифр в 5 группах.

$ ls /sys/firmware/acpi/tables
$ sudo hd /sys/firmware/acpi/tables/MSDM

00000000  ha ns oo lo oe at es ap  pl le sa uc ef or li fe  |Key in area|
00000010  cu si ca nb ro ha ms am  cu si ca nb ro ha ms am  |In key area|
00000020  it sj us ho wz ir ol lz  it sj us ho wz ir ol lz  |Area in key|
00000000  ha ns oo lo oe at es ap  pl le sa uc ef or li fe  |It is 5 x 5|
00000010  cu si ca nb ro ha ms am  cu si ca nb ro ha ms am  |Key in area|
00000020  it sj us ho wz ir ol lz  it sj us ho wz ir ol lz  |In key area|
00000050  ha ns oo lo ow az he re                           |Area in key|
00000055                                                    |It is 5 x 5|

Выполнение следующей команды выдаст ключ продукта в его стандартном формате Microsoft.

sudo hexdump -s 56 -e '"MSDM key: " /29 "%s\n"' /sys/firmware/acpi/tables/MSDM
hansooloo
источник
0

так что я видел другие ответы здесь и нужно было вмешаться. нашел

strings /sys/firmware/acpi/tables/MSDM

отлично работает, если оригинальный ключ - то, что все еще используется. Однако у меня есть несколько систем, которые поставляются с домашним дополнением, и вам нужно получить текущий ключ из реестра.

winmount=/mnt
echo "hex \\Microsoft\\Windows NT\\CurrentVersion\\DigitalProductId\nq\nq" | chntpw -e ${winmount}/Windows/System32/config/SOFTWARE

тогда нам нужно будет запустить его через алгоритм, чтобы получить ключ.

Я нашел какой-то код из https://github.com/mrpeardotnet/WinProdKeyFinder/blob/master/WinProdKeyFind/KeyDecoder.cs

    /// <summary>
    /// Decodes Windows Product Key from the DigitalProductId. 
    /// This method applies to DigitalProductId from Windows 7 or lower versions of Windows.
    /// </summary>
    /// <param name="digitalProductId">DigitalProductId to decode</param>
    /// <returns>Decoded Windows Product Key as a string</returns>
    private static string DecodeProductKey(byte[] digitalProductId)
    {
        const int keyStartIndex = 52;
        const int keyEndIndex = keyStartIndex + 15;
        var digits = new[]
        {
            'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R',
            'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9',
        };
        const int decodeLength = 29;
        const int decodeStringLength = 15;
        var decodedChars = new char[decodeLength];
        var hexPid = new ArrayList();
        for (var i = keyStartIndex; i <= keyEndIndex; i++)
        {
            hexPid.Add(digitalProductId[i]);
        }
        for (var i = decodeLength - 1; i >= 0; i--)
        {
            // Every sixth char is a separator.
            if ((i + 1) % 6 == 0)
            {
                decodedChars[i] = '-';
            }
            else
            {
                // Do the actual decoding.
                var digitMapIndex = 0;
                for (var j = decodeStringLength - 1; j >= 0; j--)
                {
                    var byteValue = (digitMapIndex << 8) | (byte)hexPid[j];
                    hexPid[j] = (byte)(byteValue / 24);
                    digitMapIndex = byteValue % 24;
                    decodedChars[i] = digits[digitMapIndex];
                }
            }
        }
        return new string(decodedChars);
    }

    /// <summary>
    /// Decodes Windows Product Key from the DigitalProductId. 
    /// This method applies to DigitalProductId from Windows 8 or newer versions of Windows.
    /// </summary>
    /// <param name="digitalProductId">DigitalProductId to decode</param>
    /// <returns>Decoded Windows Product Key as a string</returns>
    public static string DecodeProductKeyWin8AndUp(byte[] digitalProductId)
    {
        var key = String.Empty;
        const int keyOffset = 52;
        var isWin8 = (byte)((digitalProductId[66] / 6) & 1);
        digitalProductId[66] = (byte)((digitalProductId[66] & 0xf7) | (isWin8 & 2) * 4);

        const string digits = "BCDFGHJKMPQRTVWXY2346789";
        var last = 0;
        for (var i = 24; i >= 0; i--)
        {
            var current = 0;
            for (var j = 14; j >= 0; j--)
            {
                current = current*256;
                current = digitalProductId[j + keyOffset] + current;
                digitalProductId[j + keyOffset] = (byte)(current/24);
                current = current%24;
                last = current;
            }
            key = digits[current] + key;
        }

        var keypart1 = key.Substring(1, last);
        var keypart2 = key.Substring(last + 1, key.Length - (last + 1));
        key = keypart1 + "N" + keypart2;

        for (var i = 5; i < key.Length; i += 6)
        {
            key = key.Insert(i, "-");
        }

        return key;
    }

Я собираюсь попробовать декодировать алгоритм и написать его в bash. Вывод dmi, похоже, является более старым алгоритмом (<win8) для декодирования ключа. Я не нашел вариант использования нового алгоритма (> win7).

penguinjeff
источник