我正在尝试通过枚举注册表项来获取已安装程序的列表。作为测试,我这样做:
#!perl
use warnings;
use strict;
use Data::Dumper;
my $registry;
use Win32::TieRegistry (
'ArrayValues' => 1,
'Delimiter' => '/',
'TiedRef' => \$registry,
);
my $regkey = 'HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall/';
my $lmachine64 = $registry->Open( $regkey, { 'Access' => Win32::TieRegistry::KEY_READ() } );
print Data::Dumper::Dumper( $lmachine64 );
一些子键显示的数据看起来与我在regedit中看到的完全匹配,而其他子键显示为空,即使regedit显示它们包含数据。我无法找到使其中一些拥有子数据而另一些没有子数据的密钥之间有什么不同。
我在带有Strawberry Perl v5.20.2的Windows 7 64位上运行它。我没有Windows 32位系统来测试它,看看它是否与64位相关。我在一个提升的命令提示符下尝试了这个,并且我修改了有问题的键,以便“Everyone”具有完全控制权,所有这些都没有效果。
我也尝试使用HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall/
(没有Wow6432Node),同样的事情发生(有些键包含子值,有些则没有)。
更新
当我运行上面的代码时,其中一个空白键如下所示:
'{04036F66-8809-4BCF-BA28-892460F70054}/' => bless( {}, 'Win32::TieRegistry' ),
其中一个非空白键如下所示:
'{92FB6C44-E685-45AD-9B20-CADF4CABA132}.KB2894854v2/' => bless( {
'/ReleaseType' => [
'Security Update',
1
],
'/' => [
'KB2894854v2',
],
etc...
但是,如果在空白键上我运行:
print Data::Dumper::Dumper( $blank_key->{'DisplayName'} );
然后我得到了预期的价值。这可能是个问题Data::Dumper
吗?