我正在尝试将MSI产品代码GUID转换为用于标识MSI注册表项中已安装项目的产品代码ID。这有API吗?如果没有,怎么办呢?
答案 0 :(得分:5)
警告! Microsoft强烈建议您不要弄乱他们的MSI注册表项,但如果您真的必须这样做,这里有一个例程将标准产品代码GUID转换为用于的密钥格式注册表:
private static string TranslateMsiProductCode(Guid productCode)
{
// 93 CE EF F6 AA 3D 4E 99 84 E1 8F FB F7 2C 43 0D <--- Source
// 6F FE EC 39 D3 AA 99 E4 48 1E F8 BF 7F C2 34 D0 <--- Target
// ----------- ----- ----- -----------------------
// 01 23 45 67 89 01 23 45 67 89 01 23 45 67 89 01
// 0 1 2 3
// examples:
// {93CEEFF6-AA3D-4E99-84E1-8FFBF72C430D} -> 6FFEEC39D3AA99E4481EF8BF7FC234D0
// {0E837AF0-4C92-4077-83F0-D022073F17C0} -> 0FA738E029C47704380F0D2270F3710C
// {4AE61EA4-9F6F-4616-9035-0CF343EA462D} -> 4AE16EA4F6F961640953C03F34AE64D2
string input = productCode.ToString("N").ToUpper();
StringBuilder newString = new StringBuilder(input);
newString[0] = input[7];
newString[1] = input[6];
newString[2] = input[5];
newString[3] = input[4];
newString[4] = input[3];
newString[5] = input[2];
newString[6] = input[1];
newString[7] = input[0];
newString[8] = input[11];
newString[9] = input[10];
newString[10] = input[9];
newString[11] = input[8];
newString[12] = input[15];
newString[13] = input[14];
newString[14] = input[13];
newString[15] = input[12];
newString[16] = input[17];
newString[17] = input[16];
newString[18] = input[19];
newString[19] = input[18];
newString[20] = input[21];
newString[21] = input[20];
newString[22] = input[23];
newString[23] = input[22];
newString[24] = input[25];
newString[25] = input[24];
newString[26] = input[27];
newString[27] = input[26];
newString[28] = input[29];
newString[29] = input[28];
newString[30] = input[31];
newString[31] = input[30];
return newString.ToString();
}
答案 1 :(得分:0)
这是我在Perl中所做的,我在寻找更优雅的方式时偶然发现了这个问题(到目前为止没有运气)。
use strict;
use warnings;
my $guid;
if (shift() =~ /\{([0-9A-F\-]+)\}/)
{
$guid = $1;
}
die "Usage $0: <guid>\n" unless $guid;
my @sections = split /-/, $guid;
die "Malformed guid $guid\n" if @sections != 5;
my $str;
for (my $i = 0; $i < 3; ++$i)
{
$str .= reverse($sections[$i]);
}
my @tmp = split //, join('', @sections[3,4]);
for(my $i = 0; $i < @tmp; $i += 2)
{
$str .= join('', @tmp[$i+1, $i]);
}
print "$str\n";