In addition to creating keys, we can also set Registry values. To do so, we once again need an open key and the SetValue
or SetValueEx
function. SetValue
sets the default (unnamed) value for a key, while SetValueEx
allows you to create a new named value and set its information. The following example assumes that we already have the $eriko
key open:
$eriko->SetValue("blah", REG_SZ, "some_string"); $eriko->SetValueEx("foo", 0, REG_SZ, "bar");
Even though these two functions look similar, they do quite different things. The first line (SetValue
) creates a new key called blah
and sets its default (unnamed) value to some_string
. The second line (SetValueEx
) creates a new value under $eriko
with a name of foo
and a value of bar
. In both cases, we're using the REG_SZ
data type, which indicates string data.
You can do more with the Registry than just read and modify key values. You can also delete keys and export/import hives from the Registry. As we mentioned above, be extremely prudent when deleting or importing things into your registry.
Here's an example of deleting a key:
use Win32::Registry; $main::HKEY_CURRENT_USER->Open("SOFTWARE", $Software) || die "Open: $!"; $Software->Create("ERIKO", $eriko) || die "Create: $!"; # open parent key $eriko->DeleteKey("blah"); # delete blah
DeleteKey
will delete a key and all of its values - it will not delete a key with subkeys. To do that, you need to remove all of the subkeys first. Here's how you do that:
use Win32::Registry; $main::HKEY_CURRENT_USER->Open("SOFTWARE", $Software) || die "Open: $!"; $Software->Create("ERIKO", $eriko) || die "Create: $!"; $eriko->Open("blah", $blah); # open blah $blah->GetKeys(\@kids); # get all child keys foreach $k (@kids) { # kill all of them $blah->DeleteKey($k); } $eriko->DeleteKey("blah"); # now, remove blah
This code assumes that none of the child keys of blah
have child keys themselves. If they do, you'll need to do something recursive to iterate over each subkey and all of its subkeys.
The following example saves a Registry hive to an external file using the Save
method:
use Win32::Registry; $main::HKEY_LOCAL_MACHINE->Open("SOFTWARE", $Software) || die "Open: $!"; $Software->Open("ActiveState", $ActiveState) || die "Open: $!"; # write ActiveState hive to perlkeys.reg $ActiveState->Save("perlkeys.reg") || die "Save: $!";
You can connect to the Registry of a remote machine (but only to the HKEY_LOCAL_MACHINE or HKEY_USERS hives) using the RegConnectRegistry
function:
use Win32::Registry; Win32::Registry::RegConnectRegistry("\\\\somemachine", HKEY_LOCAL_MACHINE, $key) || die "connect: $!";