2

Windows ライセンス キーを取得するために、以下のコードを使用しています。それは長い間かなりうまくいきました。しかし、Windows XP (x86) では動作するが、Windows 7 x64 では動作しないことがわかりました。

理由: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;
            }
        }
    }
4

2 に答える 2

4

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 に設定したくない場合は、Interop (フラグRegOpenKeyEx()付きの Win32 API 関数KEY_WOW64_32KEY) を使用して x64 レジストリにアクセスする必要があります。

編集開始

DigitialProductId キーが null/空になる理由を説明する興味深い投稿を見つけました。

  1. Windows 7 オペレーティング システムのライセンス認証にボリューム ライセンス キーを使用しています。VLC キーは、アクティベーション後にレジストリから削除されます。
  2. 誰かがコマンドを使用して手動でレジストリ キーを削除 (このキーの内容を変更) しましたslmgr –cpky

編集終了

于 2012-04-04T19:10:39.480 に答える
1

32ビットアプリケーションは異なるレジストリパスを使用します

32ビットアプリケーションは、HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersionのレジストリパスにアクセスしますが、プロダクトキーは見つかりません。

プロセッサの種類をx64に変更すると、実際のキーを取得できました。

于 2012-04-04T18:58:22.590 に答える