2012-04-04 164 views
2

我一直在使用下面的代碼來獲取Windows許可證密鑰。它工作很長時間。但是現在我發現它可以在Windows 7(x64)上運行,但在Windows 7 x64上可以運行而不是C#獲取Windows CD密鑰

原因: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,而不是該平臺的目標任何CPU? – 2012-04-04 18:56:47

+0

不,因爲我回答了以下兩個答案,我正在使用AnyCPU。 – bytecode77 2012-04-04 19:43:17

回答

4

As user287107指出在x64操作系統上運行的x86應用程序(32位)正在使用不同的註冊表(註冊表視圖)。

爲了訪問註冊表的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你必須使用互操作(與KEY_WOW64_32KEY標誌RegOpenKeyEx() Win32 API函數)來訪問註冊表的x64 。

BEGIN編輯

我剛剛發現了一個有趣post解釋爲什麼DigitialProductId關鍵可能是空/空:

  1. 您正在使用的批量許可密鑰來激活您的Windows 7操作系統。激活後,VLC密鑰將從註冊表中刪除。
  2. 有人刪除手動使用命令的註冊表項(修改此項內容)slmgr –cpky

編輯完

+0

而且,正如user287107的答案中所發佈的,我確實使用AnyCPU,但它仍然無法正常工作。嘗試自己的代碼,看看。 – bytecode77 2012-04-04 19:23:21

+0

@DevilsChild:客戶端計算機是否使用批量許可證密鑰激活? – Hans 2012-04-04 19:24:58

+0

@DevilsChild:在我的x64位Windows 7機器上,上面的代碼返回正確的許可證密鑰。 – Hans 2012-04-04 19:26:24

1

32位應用程序使用一個不同的註冊表路徑

32位應用程序訪問在 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微軟\的Windows \ CurrentVersion 它沒有找到產品密鑰的註冊表路徑。

將處理器類型更改爲x64可以讓我獲得真正的密鑰。

+1

使用AnyCPU,而不是x64。 – 2012-04-04 19:01:39

+1

我的確使用AnyCPU,而且毫不費力。對於x86,我根本得不到任何鑰匙。 – bytecode77 2012-04-04 19:10:17