2012-04-04 4 views
2

Я использовал приведенный ниже код, чтобы получить лицензионный ключ Windows. Это работало довольно хорошо. Но теперь я обнаружил, что он работает на Windows XP (x86), но не на Windows 7 x64.C# get Windows CD Key

Причина: Значение регистра DigitalProductID содержит только нули в диапазоне, который мы ищем в 64-разрядной операционной системе. Поэтому результат BBBBB-BBBBB-BBBBB-BBBBB-BBBBB. Почему это так и как я могу это исправить?

public static string LicenseCDKey 
    { 
     get 
     { 
      try 
      { 
       byte[] rpk = (byte[])Registry.LocalMachine 
        .OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion") 
        .GetValue("DigitalProductId"); 
       string serial = ""; 
       const string possible = "BCDFGHJKMPQRTVWXY2346789"; 
       for (int i = 0; i < 25; i++) 
       { 
        int accu = 0; 
        for (int a = 0; a < 15; a++) 
        { 
         accu <<= 8; 
         accu += rpk[66 - a]; 
         rpk[66 - a] = (byte)(accu/24 & 0xff); 
         accu %= 24; 
        } 
        serial = possible[accu] + serial; 
        if (i % 5 == 4 && i < 24) 
        { 
         serial = "-" + serial; 
        } 
       } 
       return serial; 
      } 
      catch 
      { 
       return ErrorString; 
      } 
     } 
    } 
+2

ли вы изменить выход на x64 вместо любого процессора для целевой платформы? –

+0

Нет, поскольку я ответил на оба ниже ответа, я использую AnyCPU. – bytecode77

ответ

4

Как user287107 указал, что приложения x86 (32 бит), работающие в операционной системе x64, используют другой реестр (представление реестра).

Для того, чтобы получить доступ к реестру x64 у вас есть несколько вариантов:

  1. Изменение целевой платформы для x64 (настройки проекта Visual Studio).
  2. Если вы используете .Net Framework 4.0, вы можете использовать класс RegistryKey и RegistryView для доступа к реестру x64.

    RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, 
                  RegistryView.Registry64); 
    
    string keyPath = @"Software\Microsoft\Windows NT\CurrentVersion"; 
    byte[] rpk = (byte[])key.OpenSubKey(keyPath).GetValue("DigitalProductId"); 
    
  3. Если вы не используете .NET Framework 4.0 и вы не хотите, чтобы установить целевую платформу для x64, вы должны использовать Interop (RegOpenKeyEx() функции Win32 API с KEY_WOW64_32KEY флагом), чтобы получить доступ к реестру x64 ,

НАЧАТЬ РЕДАКТИРОВАНИЕ

Я просто нашел интересный post объяснить, почему ключ DigitialProductId может быть пустым/пусто:

  1. Вы используете ключ Volume License, чтобы активировать ваш Операционная система Windows 7. После активации ключ VLC будет удален из реестра.
  2. Кто-то удалил ключ реестра (модифицированное содержимое этого ключа) вручную с помощью команды slmgr –cpky

END EDIT

+0

И, как указано в ответе user287107, я использую AnyCPU, но он все еще не работает. Попробуйте сам код и посмотрите. – bytecode77

+0

@DevilsChild: активирован ли клиентский компьютер с помощью корпоративного лицензионного ключа? – Hans

+0

@DevilsChild: на моем 64-разрядном компьютере с Windows 7 код выше возвращает правильный лицензионный ключ. – Hans

1

32 разрядные приложения используют другой путь системного реестра

немного приложение 32 получает доступ к пути реестра в HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion где он не находит ключ продукта.

изменение типа процессора на x64 помогло мне получить реальный ключ.

+1

Использовать AnyCPU, а не x64. –

+1

Я использую AnyCPU действительно, все еще без усилий. С x86 я бы не получил никакого ключа вообще. – bytecode77