The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#perl -w
#
# Install this Perl as MS IIS and MS Personal Web server script processor.
#
# Written by Jeff Urlwin <jurlwin@access.digex.net>
#

use Win32::Registry;
use Getopt::Long;
use Config;

# use strict;
# can't seem to get Win32::Registry to work correctly with strict.
# it doesn't like $HKEY_LOCAL_MACHINE, below...
#

$::opt_o = 0;		# override current value of .pl in IIS...
GetOptions(qw(o!)) or die "Invalid arguments";

$perlexe = $Config{binexp} . "\\perl.exe";

print "Your configuration (lib\Config.pm) is invalid. ",
    "binexp is not set to where your perl.exe is located\n"
    unless -f $perlexe;

my $ScriptMapKey;
my $regkey
    = "SYSTEM\\CurrentControlSet\\Services\\W3SVC\\Parameters\\Script Map";

$HKEY_LOCAL_MACHINE->Open($regkey, $ScriptMapKey)
    or die "You do not have IIS or PWS installed!\n$!\n";

my %values = ();

if ($ScriptMapKey->GetValues(\%values)) {
    print "You currently have the following mappings.\n";
    foreach (sort keys (%values)) {
	print "Key: $_, Value = $values{$_}[2]\n";
    }
    print "\n";

    print "Perl is installed as a valid script for IIS/PWS\n"
	if $values{".pl"};

    if ($opt_o or !$values{".pl"}) {

	print "Setting perl as the script handler for .pl files ($perlexe).\n";

	if (!$ScriptMapKey->SetValueEx('.pl', NULL, REG_SZ, "$perlexe %s %s")) {
	    print "update of .pl value failed: $!\n",
		"Do you have permission to do this?\n";
	}
	print "$!\n";
    }
}
else {
    print "no keys?  Something's wrong...\n";
}

$ScriptMapKey->Close();