Yükseltme kodlarının aşağıdaki kayıt defteri konumunda saklandığını keşfettim.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes
Kayıt defteri anahtarı adı, yükseltme kodudur ve kayıt defteri anahtarı değeri adı, ürün kodudur. Bu değerleri kolaylıkla çıkarabilirim ancak kodlar farklı bir biçimde saklanır. Kırmızı daire biçimlendirilmiş yükseltme kodunu gösterir, mavi daire regedit.exe
'da görüntülendiğinde biçimlendirilmiş ürün kodunu gösterir.
tire Guid
dışına soyulur ve sonra dize tersine dönmesinin bir dizi yapılır. İlk 8 karakter tersine çevrilir, ardından sonraki 4, sonra aşağıdaki 4 ve daha sonra dizenin geri kalanı 2 karakter kümesinde tersine çevrilir. Normalde, bir dizgiyi tersine çevirirken, kontrolün ve özel karakterlerin doğru bir şekilde (see Jon Skeet's aricle here) ele alınmasına dikkat etmemiz gerekir, ancak bu durumda, bir Guid
dizgisiyle ilgili olarak, dizgenin doğru bir şekilde tersine çevrileceğinden emin olabiliriz.
Kayıttan bilinen bir ürün kodu için yükseltme kodunu ayıklamak için kullandığım kodun tamamı aşağıdadır.
internal static class RegistryHelper
{
private const string UpgradeCodeRegistryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes";
private static readonly int[] GuidRegistryFormatPattern = new[] { 8, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2 };
public static Guid? GetUpgradeCode(Guid productCode)
{
// Convert the product code to the format found in the registry
var productCodeSearchString = ConvertToRegistryFormat(productCode);
// Open the upgrade code registry key
var localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var upgradeCodeRegistryRoot = localMachine.OpenSubKey(UpgradeCodeRegistryKey);
if (upgradeCodeRegistryRoot == null)
return null;
// Iterate over each sub-key
foreach (var subKeyName in upgradeCodeRegistryRoot.GetSubKeyNames())
{
var subkey = upgradeCodeRegistryRoot.OpenSubKey(subKeyName);
if (subkey == null)
continue;
// Check for a value containing the product code
if (subkey.GetValueNames().Any(s => s.IndexOf(productCodeSearchString, StringComparison.OrdinalIgnoreCase) >= 0))
{
// Extract the name of the subkey from the qualified name
var formattedUpgradeCode = subkey.Name.Split('\\').LastOrDefault();
// Convert it back to a Guid
return ConvertFromRegistryFormat(formattedUpgradeCode);
}
}
return null;
}
private static string ConvertToRegistryFormat(Guid productCode)
{
return Reverse(productCode, GuidRegistryFormatPattern);
}
private static Guid ConvertFromRegistryFormat(string upgradeCode)
{
if (upgradeCode == null || upgradeCode.Length != 32)
throw new FormatException("Product code was in an invalid format");
upgradeCode = Reverse(upgradeCode, GuidRegistryFormatPattern);
return Guid.Parse(upgradeCode);
}
private static string Reverse(object value, params int[] pattern)
{
// Strip the hyphens
var inputString = value.ToString().Replace("-", "");
var returnString = new StringBuilder();
var index = 0;
// Iterate over the reversal pattern
foreach (var length in pattern)
{
// Reverse the sub-string and append it
returnString.Append(inputString.Substring(index, length).Reverse().ToArray());
// Increment our posistion in the string
index += length;
}
return returnString.ToString();
}
}
yerine kayıt kullanarak, ** Bu cevap açıklandığı gibi WMı'ni kullanmanızı öneriyoruz **: [** Ben nasıl Yüklü bir MSI dosyası için Yükseltme Kodunu bulmak? **] (https: // stackoverflow.com/sorular/46637094/how-can-ı-bulmak-yükseltme-kod-için-bir-yüklü-msi-dosya/46637095 # 46637095). Bu, doğru yükseltme kodunu almanızı sağlayacak ve herhangi bir dönüşüm veya yorum gerektirmeyecektir. ** Gerçek yükseltme kodunu uygun formatta ** alacaksınız. –