# Script to configure Automatic Updates from a command prompt.
# Part of .
# 2004-02-15 Nils Østbjerg
use warnings;
use strict;
use Getopt::Long;
use Pod::Usage;
my %opts;
GetOptions (\%opts, 'help|h|?', 'day=i', 'time=i', 'remote=s', 'wait=i',
'sus=s', 'status=s', 'noautoreboot', 'policy')
or pod2usage (2);
(exists $opts{'help'})
and pod2usage ('-exitstatus' => 0, '-verbose' => 2);
# Ensure exactly one argument after options.
scalar @ARGV == 1
or pod2usage (2);
my ($au_options) = @ARGV;
## Initialize the hashes
my %au_values = ('ScheduledInstallDay' => 255,
'ScheduledInstallTime' => 255,
'RescheduleWaitTime' => 255,
'AUOptions' => 255,
'NoAutoRebootWithLoggedOnUsers' => 255,
'NoAutoUpdate' => 255,
'UseWUServer' => 255
);
my %wu_values = ('WUServer' => '',
'WUStatusServer' => '',
);
my %old_values = ('AUOptions' => 254,
'AUState' => 254,
'ScheduledInstallDay' => 255,
'ScheduledInstallTime' => 255
);
## Validate all options.
if ($opts{'policy'}) {
# Use policy settings.
if ($au_options eq "off" || $au_options eq "1") {
(exists $opts{'day'} || exists $opts{'time'}
|| exists $opts{'wait'} || exists $opts{'sus'}
|| exists $opts{'status'} || exists $opts{'noautoreboot'})
and die ("only the --remote option is allowed for this mode\n");
$au_values{'NoAutoUpdate'} = 1;
} elsif ($au_options eq "notify" || $au_options eq "2") {
(exists $opts{'day'} || exists $opts{'time'} || exists $opts{'wait'})
and die ("--day, --time and --wait options is not allowed for this mode\n");
$au_values{'AUOptions'} = 2;
} elsif ($au_options eq "download"|| $au_options eq "3" ) {
(exists $opts{'day'} || exists $opts{'time'} || exists $opts{'wait'})
and die ("--day, --time and --wait options is not allowed for this mode\n");
$au_values{'AUOptions'} = 3;
} elsif ($au_options eq "install"|| $au_options eq "4" ) {
(exists $opts{'day'} && exists $opts{'time'} && exists $opts{'wait'})
or die "--day, --time and --wait options required for this mode\n";
if ($opts{'day'} =~ /^[01234567]$/) {
$au_values{'ScheduledInstallDay'} = $opts{'day'};
} else {
die "--day must be between 0 and 7\n";
}
if ($opts{'time'} =~ /^\d+$/ && $opts{'time'} >= 0 && $opts{'time'} <= 23) {
$au_values{'ScheduledInstallTime'} = $opts{'time'};
} else {
die "--time must be between 0 and 23\n";
}
if ($opts{'wait'} =~ /^\d+$/ && $opts{'wait'} >= 1 && $opts{'wait'} <= 60) {
$au_values{'RescheduleWaitTime'} = $opts{'wait'};
} else {
die "--wait must be between 1 and 60\n";
}
$au_values{'AUOptions'} = 4;
} else {
die "Argument must be 1, off, 2, notify, 3, download, 4, or install.\n";
}
if (exists $opts{'noautoreboot'}) {
$au_values{'NoAutoRebootWithLoggedOnUsers'} = 1;
}
if (exists $opts{'sus'}) {
if ($opts{'sus'} =~ /^http\:\/\/.+$/ ) {
$wu_values{'WUServer'} = $opts{'sus'};
$au_values{'UseWUServer'} = 1;
} else {
die ("syntax is : --sus http://susserver.example.com");
}
}
if (exists $opts{'status'}) {
if ($opts{'status'} =~ /^http\:\/\/.+$/ ) {
$wu_values{'WUStatusServer'} = $opts{'status'};
} else {
die ("syntax is : --status http://susserver.example.com");
}
}
} else {
# Use old settings, and allow admins to configure it.
if ($au_options eq "off" || $au_options eq "1") {
(exists $opts{'day'} || exists $opts{'time'} )
and die ("only the --remote option is allowed for this mode\n");
$old_values{'AUOptions'} = 1;
$old_values{'AUState'} = 7;
} elsif ($au_options eq "notify" || $au_options eq "2") {
(exists $opts{'day'} || exists $opts{'time'})
and die ("--day and --time options is not allowed for this mode\n");
$old_values{'AUOptions'} = 2;
$old_values{'AUState'} = 2;
} elsif ($au_options eq "download"|| $au_options eq "3" ) {
(exists $opts{'day'} || exists $opts{'time'})
and die ("--day and --time options is not allowed for this mode\n");
$old_values{'AUOptions'} = 3;
$old_values{'AUState'} = 2;
} elsif ($au_options eq "install"|| $au_options eq "4" ) {
(exists $opts{'day'} && exists $opts{'time'})
or die "--day and --time options required for this mode\n";
if ($opts{'day'} =~ /^[01234567]$/) {
$old_values{'ScheduledInstallDay'} = $opts{'day'};
} else {
die "--day must be between 0 and 7\n";
}
if ($opts{'time'} =~ /^\d+$/ && $opts{'time'} >= 0 && $opts{'time'} <= 23) {
$old_values{'ScheduledInstallTime'} = $opts{'time'};
} else {
die "--time must be between 0 and 23\n";
}
$old_values{'AUOptions'} = 4;
$old_values{'AUState'} = 2;
} else {
die "Argument must be 1, off, 2, notify, 3, download, 4, or install.\n";
}
if (exists $opts{'noautoreboot'} || exists $opts{'sus'} || exists $opts{'status'}) {
die ("The --policy option is required for the use of this option.\n");
}
}
## Change the registry settings.
my %reg;
use Win32::TieRegistry (Delimiter => '/', TiedHash => \%reg);
my $key_name = ('HKEY_LOCAL_MACHINE/SOFTWARE/Policies/Microsoft/Windows/');
my $wu_key_name = ('WindowsUpdate/');
my $au_key_name = ('AU/');
($opts{'remote'})
and $key_name = "//$opts{'remote'}/$key_name";
my $key = $reg{$key_name};
defined $key
or die "Unable to open $key_name";
foreach my $name (sort keys %wu_values) {
my $val = $wu_values{$name};
if ($val eq '') {
if (exists $key->{"$wu_key_name$name"}) {
(delete $key->{"$wu_key_name$name"})
or die "Unable to delete $key_name$wu_key_name$name: $^E";
}
} else {
$key->{"$wu_key_name"}= { "/$name" => $val}
or die "Unable to set $key_name$wu_key_name$name to $val: $^E";
}
}
foreach my $name (sort keys %au_values) {
my $val = $au_values{$name};
if ($val == 255 ) {
if (exists $key->{"$wu_key_name$au_key_name$name"}) {
(delete $key->{"$wu_key_name$au_key_name$name"})
or die "Unable to delete $key_name$wu_key_name$au_key_name$name: $^E";
}
} else {
$key->{"$wu_key_name"}= { "$au_key_name" =>
{
"/$name" => [ pack("L", $val), "REG_DWORD" ]
}
}
or die "Unable to set $key_name$au_key_name$name to $val: $^E";
}
}
my $old_key_name = ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/'
. 'CurrentVersion/WindowsUpdate/Auto Update/');
($opts{'remote'})
and $old_key_name = "//$opts{'remote'}/$old_key_name";
my $old_key = $reg{$old_key_name};
defined $old_key
or die "Unable to open $old_key_name";
foreach my $name (sort keys %old_values) {
my $val = $old_values{$name};
if ($val == 255 ) {
if (exists $old_key->{"$name"}) {
delete $old_key->{"$name"}
or die "Unable to delete $old_key_name$name: $^E";
}
} elsif ($val != 254) {
$old_key->{"/$name"} = [ pack("L", $val), "REG_DWORD" ]
or die "Unable to set $old_key_name$name to $val: $^E";
}
}
__END__
=head1 NAME
auconfig.pl - Configure Windows AutoUpdate
=head1 SYNOPSIS
auconfig.pl [ options ]
Commands:
1 | off Disable automatic updates
2 | notify Notify user before download
3 | download Download automatically; notify user before install
4 | install Download and install automatically
Options:
--help Display verbose help and exit (RECOMMENDED)
--policy Use system policy settings
--remote Operate on instead of local machine
--day Day of week for autoupdate (1 == Sunday; 0 == every day)
--time Time for auto update (0 == midnight, 23 == 11 P.M.)
--wait How long after a restart a rescheduled install starts
--sus Specifies the URL address of the SUS server to be used
--status Specifies the URL address of the SUS stastistics server
--noautoreboot Turns off automatic reboots while users are logged on
=head1 DESCRIPTION
auconfig.pl configures the Windows 2000 and XP "Auto Updates"
facility.
The off command allows no options, except --policy and --remote.
The notify and download commands requires no options, but allows all
excepts the --day, --time and --wait options.
All options are allowed with the install command, and the --day,
and --time are required. If the --policy option is used the --wait
option is required as well.
The --policy option is required for all options except --remote,
--day and --time. When the --policy option is use the settings is
a system policy, which cant be changed from the GUI.
The --day option specifies which weekday the automatic installation
runs. The value must be between 0 and 7. 1 means Sunday, 2
means Monday, and 7 means Saturday. 0 means every day.
The --time option specifies at which time the automatic installation
runs. The value must be between 0 and 23. 0 mean midnight, 1 means
1 A.M., 12 means noon, and 23 means 11 P.M.
With the --wait you specify the amount of minutes a computer waits
before preforming installations which was scheduled to take place while
the computer was off. The range is from 1 to 60 minutes.
The --sus option enables Automatic Updates to use the Software Update
Services server specified.
The format of the url is http://susserver.example.com
The --status allows you to specify the SUS statistics server. The format of
the url is the same as with --sus.
The --noautoreboot option makes Automatic Update present the user
with a request for a system reboot if one is required, instead of the
default behavior where the system will reboot if required, something
that may result in loss of data.
=head1 SEE ALSO
C
C
C