Find the Windows 11 product key using Linux
I have a dual boot on my desktop pc: Windows 11 and Ubuntu Linux. I hardly every use the Windows installation. Maybe for some games, but Steam has gotten better and better at supporting games on Linux. Or when you need to login on some government website with your eID and you can’t use the ItsMe app.
Many moons ago I did a boo-boo: for some reason I felt that I had to make my EFI system partition bigger. Which also meant resizing and moving all other partitions. Linux didn’t flinch but Windows pooped in its pants. Apparently that operating system is soooo legacy that it can’t cope with a simple partition move. I tried to fix it using a Windows system repair disk but the damn thing just couldn’t be arsed.
For a long time I just couldn’t be bothered with any further repair attempts. I don’t need that Windows anyway. I can always run Windows in VirtualBox if I really need it. It also means that I can nuke a 414 GiB partition and use that space for better things. As you can see in the screenshot, I mounted it on
/mnt/windows with the intention of copying the directory
Users/Amedee to Linux, in case there was still something of value there. Probably not, but better safe than sorry.
There’s just one small snag: for the life of me, I couldn’t find a Windows activation key, or remember where I put it. It’s not an OEM PC so the key isn’t stored in the BIOS. And I didn’t want to waste money on buying another license for an operating system that I hardly ever use.
I googled for methods to retrieve the Windows activation key. Some methods involve typing a command on the command prompt of a functioning Windows operating system, so those were not useful for me. Another method is just reading the activation key from the Windows Registry:
I don’t need a working Windows operating system to read Registry keys, I can just mount the Windows filesystem in Linux and query the Registry database files in
/Windows/System32/config/. I found 2 tools for that purpose:
This one is the simplest, it directly outputs the value of a registry key.
sudo apt install --yes libhivex-bin
hivexget /mnt/windows/Windows/System32/config/SOFTWARE \ "\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" \ BackupProductKeyDefault XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
This requires a bit more typing.
sudo apt install --yes reglookup
reglookup -p "/Microsoft/Windows NT/CurrentVersion/SoftwareProtectionPlatform/BackupProductKeyDefault" \ /mnt/windows/Windows/System32/config/SOFTWARE PATH,TYPE,VALUE,MTIME /Microsoft/Windows NT/CurrentVersion/SoftwareProtectionPlatform/BackupProductKeyDefault,SZ,XXXXX-XXXXX-XXXXX-XXXXX-XXXXX,
The output has a header and is comma separated. Using
-H removes the header, and then
cut does the rest of the work;
reglookup -H -p "/Microsoft/Windows NT/CurrentVersion/SoftwareProtectionPlatform/BackupProductKeyDefault" \ /mnt/windows/Windows/System32/config/SOFTWARE \ | cut --delimiter="," --fields=3 XXXXX-XXXXX-XXXXX-XXXXX-XXXXX