質問: linuxからのwindows 7プロダクトキーの取得/復号化 まだ実行中のハードドライブを誤って切断し、windows 7インストールを破損しました。現在、完全にwindowsを起動できません。 windowsスタートアップ修復、chkdsk/r、sfc/scannow、bootrec/rebuildbcdなどのすべてを試して、インストールを修復しようとしましたが、うまくいきませんでした。フレッシュインストールだけを実行したいのですが、問題は、windowsプロダクトキーをどこにも書き留めておらず、スクリプトやユーティリティを使用してレジストリから取得できないため、windowsを起動できないためです。windows 7のプロダクトキーは、レジストリキーhkey_local_machine\software\microsoft\windows nt\currentversionの "digitalproductid"値に保存、暗号化されています。破損したwindowsパーティションをubuntuライブcdから読み取り専用でマウントし、問題のキーと値を含むwindows\system32\config\softwareレジストリハイブをフラッシュドライブにコピーできましたが、このハイブをregeditにロードしています作業中のwindowsインストールで、スクリプトまたはユーティリティを使用して、読み込まれた "digitalproductid"値を解読しようとすると、いくらいじっても、ホストwindowsインストールのプロダクトキーしか返されません。私はマイクロソフトのサポートに連絡してみましたが、彼らはかなり役に立ちませんでした。誰かが私をさらに案内することができますか? linuxからプロダクトキーを取得する別の方法がある場合はどうでしょうか。スクリプティング/暗号化に詳しいユーザーが、解読スクリプトに従ってプロダクトキーを手動で解読しようとする場合は、エクスポートされた「digitalproductid」値、ソフトウェアレジストリハイブ、および解読スクリプトをメールで送信できます。
回答: 少しコーディングをするのが恥ずかしくない人のために。私は約10年前にアルゴリズムを見つけ、それをc#に実装しました(以下を参照)windowsで実行したいだけの場合私は自由にそれをpowershellスクリプトに変換しました:$dpid = get-itemproperty -path "registry::hkey_local_machine\software\microsoft\windows nt\currentversion" -name "digitalproductid" # get the range we are interested in $id = $dpid.digitalproductid[52..(52+14)] # character table $chars = "bcdfghjkmpqrtvwxy2346789" # variable for the final product key $pkey = "" # calculate the product key for ($i=0; $i -le 24; $i++) { $c = 0 for($j=14; $j -ge 0; $j--) { $c = ($c -shl 8) -bxor $id[$j] $id[$j] = [math]::floor($c / 24) -band 255 $c = $c % 24 } $pkey = $chars[$c] + $pkey } # insert some dashes for($i = 4; $i -gt 0; $i--) { $pkey = $pkey.insert($i * 5, "-") } $pkey これを実行すると、プロダクトキーが取得されます。 (結局のところ、あなたのためのコーディングはありません)元の投稿したがって、これは私が掘り下げてコメントした実際のc#コードです。public static string convertdigitalproductid(string regpath, string searchkey = "digitalproductid") { // open the sub key i.e.: "software\microsoft\windows nt\currentversion" var regkey = registry.localmachine.opensubkey(regpath, false); // retreive the value of "digitalproductid" var dpid = (byte[])regkey.getvalue(searchkey); // prepare an array for the relevant parts var idpart = new byte[15]; // copy the relevant parts of the array array.copy(dpid, 52, idpart, 0, 15); // prepare the chars that will make up the key var charstore = "bcdfghjkmpqrtvwxy2346789"; // prepare a string for the result string productkey = ""; // we need 24 iterations (one for each character) for(int i = 0; i < 25; i++) { int c = 0; // go through each of the 15 bytes of our dpid for(int j = 14; j >= 0; j--) { // shift the current byte to the left and xor in the next byte c = (c << 8) ^ idpart[j]; // leave the result of the division in the current position idpart[j] = (byte)(c / 24); // take the rest of the division forward to the next round c %= 24; } // after each round, add a character from the charstore to our key productkey = charstore[c] + productkey; } // insert the dashes for(int i = 4; i > 0; i--) { productkey = productkey.insert(i * 5, "-"); } return productkey; } 渡す必要がありますsoftware\microsoft\windows nt\currentversionキーとして、digitalproductidを検索します当時、ms office製品は同じアルゴリズムを使用していたため、関数に関連するレジストリキーを提供することで、それらの製品キーも計算できました。もちろん、バイト配列を入力として受け取るように関数をリファクタリングできます。今日も。 windows 10マシンでテストしたところ、まだ動作しています。