Visual Studio License Key Management
2023-12-18
筆記如何從 regedit
檢視與管理 Visual Studio 使用的 License Key。
說明
Visual Studio 的 License Key 是以機碼的方式儲存在 Registry。
路徑規則如下:
HKEY_CLASSES_ROOT\Licenses\product.GUID\product.MPC
Product | GUID | MPC |
---|---|---|
Visual Studio 2017 Enterprise | 5C505A59-E312-4B89-9508-E162F8150517 | 08860 |
Visual Studio 2017 Professional | 5C505A59-E312-4B89-9508-E162F8150517 | 08862 |
Visual Studio 2019 Enterprise | 41717607-F34E-432C-A138-A3CFD7E25CDA | 09260 |
Visual Studio 2019 Professional | 41717607-F34E-432C-A138-A3CFD7E25CDA | 09262 |
Visual Studio 2022 Enterprise | 1299B4B9-DFCC-476D-98F0-F65A2B46C96D | 09660 |
Visual Studio 2022 Professional | 1299B4B9-DFCC-476D-98F0-F65A2B46C96D | 09662 |
而儲存在 Registry 的 License Key 會加密為 Binary,必須搭配 System.Security.Cryptography
使用 ProtectedData.Unprotect
的方式解密 Licence Key。
以下節錄 terjew VSKeyExtractor | GitHub 的處理 Sample Code:
var product = new Product("Visual Studio 2022 Professional", "1299B4B9-DFCC-476D-98F0-F65A2B46C96D", "09662");
var encrypted = Registry.GetValue($"HKEY_CLASSES_ROOT\\Licenses\\{product.GUID}\\{product.MPC}", "", null);
if (encrypted == null) return;
try
{
var secret = ProtectedData.Unprotect((byte[])encrypted, null, DataProtectionScope.CurrentUser);
var unicode = new UnicodeEncoding();
var str = unicode.GetString(secret);
foreach (var sub in str.Split('\0'))
{
var match = Regex.Match(sub, @"\w{5}-\w{5}-\w{5}-\w{5}-\w{5}");
if (match.Success)
{
Console.WriteLine($"{product.Name} key: {match.Captures[0]}");
}
}
}
catch (Exception) { }
相同的操作改為 PowerShell Script
# Accessing the registry value
$regPath = "Registry::HKCR\Licenses\$($product.GUID)\$($product.MPC)"
$productName = "Visual Studio 2022 Professional"
$productGUID = "1299B4B9-DFCC-476D-98F0-F65A2B46C96D"
$productMPC = "09662"
# Retrieve encrypted data from registry
$registryPath = "Registry::HKCR\Licenses\$productGUID\$productMPC"
$encrypted = Get-ItemPropertyValue -Path $registryPath -Name '(default)'
# Decrypt the data
Add-Type -AssemblyName System.Security
$secret = [System.Security.Cryptography.ProtectedData]::Unprotect(
$encrypted, $null,
[System.Security.Cryptography.DataProtectionScope]::CurrentUser)
# Convert to Unicode string
$unicode = New-Object System.Text.UnicodeEncoding
$str = $unicode.GetString($secret)
# Search for product key pattern
$str -split '\0' | ForEach-Object {
if ($_ -match "\w{5}-\w{5}-\w{5}-\w{5}-\w{5}") {
Write-Output "$($productName) key: $($matches[0])"
}
}
如果想要更改所使用的 License Key 也可以透過 Registry 的操作來達成,而不需要重新安裝 Visual Studio 😀
而如果是 Visual Studio 的試用期,可以參考 beatracker 所分享的 VSCELicense | GitHub 的 PowerShell Script。