まだ実行中のハードドライブを誤って切断し、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」値、ソフトウェアレジストリハイブ、および解読スクリプトをメールで送信できます。
Linuxで利用できるchntpw
という優れたツールがあります。 Debian/Ubuntuで簡単に入手できます。
Sudo apt install chntpw
関連するレジストリファイルを調べるには、Windowsディスクをマウントして次のように開きます。
chntpw -e /path/to/windisk/Windows/System32/config/software
デコードされたDigitalProductId
を取得するには、次のコマンドを入力します。
dpi \Microsoft\Windows NT\CurrentVersion\DigitalProductId
Python他の回答の移植版(Windows 8.1に適合)です。chntpw
よりも優れている点は、読み取り専用状態のドライブでも機能することです。
要件:
pip install python-registry
コード:
#!/usr/bin/env python
import sys
from Registry import Registry
reg = Registry.Registry("/path/to/drive/Windows/System32/config/RegBack/SOFTWARE")
# Uncomment for registry location for Windows 7 and below:
#reg = Registry.Registry("/path/to/drive/Windows/system32/config/software")
key = reg.open("Microsoft\Windows NT\CurrentVersion")
did = bytearray([v.value() for v in key.values() if v.name() == "DigitalProductId"][0])
idpart = did[52:52+15]
charStore = "BCDFGHJKMPQRTVWXY2346789";
productkey = "";
for i in range(25):
c = 0
for j in range(14, -1, -1):
c = (c << 8) ^ idpart[j]
idpart[j] = c // 24
c %= 24
productkey = charStore[c] + productkey
print('-'.join([productkey[i * 5:i * 5 + 5] for i in range(5)]))
少しコーディングをするのが恥ずかしくない人のために。
私は約10年前にアルゴリズムを見つけ、それをC#に実装しました(以下を参照)
私は自由にそれを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マシンでテストしたところ、まだ動作しています。
これが私のbash実装です。 get_windows_key.shをclonezillaから正常に機能させると呼びます。私は最初にそれをここに投稿しました https://sourceforge.net/p/clonezilla/discussion/Open_discussion/thread/979f335385/
#!/bin/bash
# written by Jeff Sadowski
# credit
###################################################
# Pavel Hruška, Scott Skahht, and Philip M for writting
# https://github.com/mrpeardotnet/WinProdKeyFinder/blob/master/WinProdKeyFind/KeyDecoder.cs
# that I got my conversion code from
#
# I used the comments on the Sudo code from
# https://askubuntu.com/questions/953126/can-i-recover-my-windows-product-key- from-ubuntu
# by MrPaulch
#
# and the creator of chntpw
#
# Petter Nordahl-Hagen
# without which I would not be able to get the key in linux
#
# also the creators of ntfs-3g, linux and bash
parted -l 2>/dev/null |grep -e ntfs -e fat -e Disk|grep -v Flags
#get the first mac address that isn't a loopback address
# loopback will have all zeros
MAC=$(cat /sys/class/net/*/address|grep -v 00:00:00:00:00:00|head -n 1|sed "s/:/-/g")
if [ "$1" = "" ];then
echo "mount the Windows share then give this script the path where you mounted it"
exit
fi
cd $1
#
# This way will work no matter what the capitalization is
next=$(find ./ -maxdepth 1 -iname windows);cd ${next}
next=$(find ./ -maxdepth 1 -iname system32);cd ${next}
next=$(find ./ -maxdepth 1 -iname config);cd ${next}
file=$(find ./ -maxdepth 1 -iname software)
#echo $(pwd)${file:1}
#Get the necissary keys
#get the version key
VERSION=$((16#$(echo -e "cat \\Microsoft\\Windows NT\\CurrentVersion\\CurrentMajorVersionNumber\nq\n" | chntpw -e ${file}|grep "^0x"|cut -dx -f2)))
hexPid_csv_full=$(echo $(echo -e "hex \\Microsoft\\Windows NT\\CurrentVersion\\DigitalProductId\nq\n" | chntpw -e ${file}|grep "^:"|cut -b 9-55)|sed 's/ /,/g' | tr '[:u>
# get the subset 53 to 68 of the registry entry
hexPid_csv=$(echo $(echo -e "hex \\Microsoft\\Windows NT\\CurrentVersion\\DigitalProductId\nq\n" | chntpw -e ${file}|grep "^:"|cut -b 9-55)|sed 's/ /,/g' | tr '[:upper:>
echo "${hexPid_csv_full}" > /custom/DigitalProductId_${MAC}.txt
#formatted output
spread()
{
key=$1
echo ${key:0:5}-${key:5:5}-${key:10:5}-${key:15:5}-${key:20:5}
}
# almost a direct conversion of c# code from
# https://github.com/mrpeardotnet/WinProdKeyFinder/blob/master/WinProdKeyFind/KeyDecoder.cs
# however most of this looks similar to Sudo code I found
# https://askubuntu.com/questions/953126/can-i-recover-my-windows-product-key-from-ubuntu
DecodeProductKey()
{
digits=(B C D F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9)
for j in {0..15};do
#Populate the Pid array from the values found in the registry
Pid[$j]=$((16#$(echo ${hexPid_csv}|cut -d, -f $(($j+1)))))
done
if [ "$1" = "8+" ];then
# modifications needed for getting the windows 8+ key
isWin8=$(($((${Pid[14]}/6))&1))
Pid[14]=$(( $(( ${Pid[14]}&247 )) | $(( $(( ${isWin8} & 2 )) * 4 )) ))
fi
key=""
last=0
for i in {24..0};do
current=0
for j in {14..0};do
# Shift the current contents of c to the left by 1 byte
# and add it with the next byte of our id
current=$((${current}*256))
current=$((${Pid[$j]} + current))
# Put the result of the divison back into the array
Pid[$j]=$((${current}/24))
# Calculate remainder of c
current=$((${current}%24))
last=${current}
done
# Take character at position c and prepend it to the ProductKey
key="${digits[${current}]}${key}"
done
if [ "$1" = "8+" ];then
# another modification needed for a windows 8+ key
key="${key:1:${last}}N${key:$((${last}+1)):24}"
echo -n "Windows 8+ key: "
else
echo -n "Windows 7- key: "
fi
spread "${key}"
}
if [ "$VERSION" -gt "7" ];then
DecodeProductKey 8+
else
DecodeProductKey
fi