############################################################################ ### Title: regtool.pl ### Description: Win32 Registry key listing ############################################################################ use Win32::TieRegistry; use Getopt::Long; use Pod::Usage; use strict; use vars qw($pound $key $help $man); my %regtypes = (1=>'REG_SZ', 2=> 'REG_EXPAND_SZ', 3=>'REG_BINARY', 4=>'REG_DWORD', 7=>'REG_MULTI_SZ'); sub ListKey { #$RRef is a TieRegistry ref my $RRef = shift; for my $key ($RRef->SubKeyNames) { print "[$key]\n"; } for my $key ($RRef->ValueNames) { my ($ValueData,$ValueType)= $RRef->GetValue( $key ); $key = "(Default)" unless $key; if ($regtypes{$ValueType} eq 'REG_BINARY') { $ValueData = unpack ("H*", $ValueData); $ValueData =~ s/([0-9a-f]{2})/$1 /gi; } elsif ($regtypes{$ValueType} eq 'REG_MULTI_SZ') { $ValueData= join "\n\t",@$ValueData; } print "$key ($regtypes{$ValueType})\n\t$ValueData\n"; } printf ("%0d keys, %0d values", scalar $RRef->SubKeyNames, scalar $RRef->ValueNames); } sub ExtendedPath { my $rpath=shift; $$rpath =~ s|/?[^/]*/\.\.||g; } GetOptions('help|?' => \$help, man => \$man); pod2usage(1) if $help; pod2usage(-exitstatus => 0, -verbose => 2) if $man; #First of all, the registry delimiter (to avoid backslashing) $pound= $Registry->Delimiter("/"); #Without these two lines, we can't read REG_MULTI_SZ or REG_EXPAND_SZ keys $Registry->FixSzNulls(1); $Registry->SplitMultis(1); #If there is a parameter, we will try to use it as "current key" my $subkey = shift; eval { $Registry->Open($subkey); }; #If there is an error, current key is the root of the registry $subkey ="" if ($@); for (;;) { #Interactive Mode #First, we print the prompt (path and $) print "\n[/$subkey]\$ "; #Read the command my $command = ; chomp $command; my ($commandname, @arguments) = split /\s+/, $command; my $arguments = join " ",@arguments; if (lc $commandname eq 'quit' or lc $commandname eq 'exit') { last; } elsif ( lc $commandname eq 'dir' or lc $commandname eq 'ls') { #List command #If there is a paremeter, could be a key that we want to list $arguments = $subkey unless $arguments; ExtendedPath(\$arguments); #If no, we'll list the current key eval { $key = $Registry->Open($arguments); }; if ($@ or ref $key ne 'Win32::TieRegistry') { #If error, $arguments maybe a relative path eval { my $path = "$subkey/$arguments"; ExtendedPath(\$path); $key = $Registry->Open($path); }; if ($@ or ref $key ne 'Win32::TieRegistry') { print "Error: $arguments doesn't exist\n"; next; } } ListKey($key); } elsif (lc $commandname eq 'cd') { #"Change Directory" command unless ($arguments) { #If not parameter, "current key" is shown print "$subkey\n"; } #If there is a paremeter, we try to open this registry key eval { $key = $Registry->Open($arguments); }; if ($@ or ref $key ne 'Win32::TieRegistry') { #If error, may be a "relative path" to the current key eval { my $path = "$subkey/$arguments"; ExtendedPath(\$path); $key = $Registry->Open($path); }; if ($@ or ref $key ne 'Win32::TieRegistry') { print "Error: $arguments doesn't exist\n"; next; } else { $arguments="$subkey/$arguments"; ExtendedPath(\$arguments); } } $subkey = $arguments; } else { print "$commandname is not a valid command.\n"; } } =pod =head1 NAME regtool.pl - Win32 Registry list keys =head1 SYNOPSIS regtool.pl is a simple utility to list win32 registry keys. =head2 regtool.pl sintax regtool.pl regtool.pl --help, regtool -h regtool.pl --man, regtool -m =head1 OPTIONS =over 4 =item cd key Change current key =item dir [key] (or ls [key]) List key. If key is not provided, actual registry key is listed =item quit (or exit) Quit regtool.pl =back =head1 DESCRIPTION This utility allows to list keys in the Win32 Registry. When you execute regtool.pl you see a console like this: [/]$ You can move arround the keys of the registry like if you where in a directory tree. When you use cd (change directory) or ls (list directory) it is possible to use '.' and '..' to refer the "actual registry key" and the "previous registry key" [/LMachine]$ cd SOFTWARE [/LMachine/SOFTWARE]$ cd ../SYSTEM [/LMachine/SYSTEM]$ To list a key, you can use 'ls' or dir command [/LMachine/Software]$ ls .. [HARDWARE] [SAM] [SECURITY] [SOFTWARE] [SYSTEM] 5 keys, 0 values [/LMachine/Software/Perl]$ ls (Default) (REG_SZ) D:\Perl\ BinDir (REG_SZ) D:\Perl\bin\perl.exe regtool.pl can list: REG_SZ REG_EXPAND_SZ REG_BINARY REG_DWORD REG_MULTI_SZ keys =head1 AUTHOR Fermin Palacios (hopes at perlmonks.org) larioja.pm@fitipaldis.com =cut