# /usr/bin/perl # child process to background # poll windows service (scheduler) and re-enable + start use Win32::Service; use Win32::OLE; use strict; # set logfile location my $logfile = 'log.txt'; my ($key, %service, %status); while (1) { Win32::Service::GetStatus('','Schedule', \%status); if (!($status{CurrentState} == 4)) { # service probably disabled, set to automatic again set_starttype('automatic','schedule'); Win32::Service::StartService('', 'Schedule') || die "could not start service: $!\n"; open(LOG, '>>', $logfile); print LOG currtime() . "\tscheduler stop detected, restarted the service\n"; close LOG; } sleep(60); } # culled/tweaked from: http://unattended.sourceforge.net/ sub set_starttype { my ($type, $service_name) = @_; # Convert to lower-case $type = lc $type; $service_name = lc $service_name; my %types = map { (lc $_ => $_) } ('Boot', 'System', 'Automatic', 'Manual', 'Disabled'); (exists $types{$type}) or die ' must be one of ', join ' ', keys %types; # Bomb out completely if COM engine encounters any trouble. Win32::OLE->Option ('Warn' => 3); # Get a handle to the SWbemServices object of the local machine. my $computer = Win32::OLE->GetObject ('WinMgmts:'); # Get the SWbemObjectSet of all services. See: # http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_service.asp my $services_set = $computer->InstancesOf ('Win32_Service'); # Convert set to a Perl array. my @services = Win32::OLE::Enum->All ($services_set); foreach my $service (@services) { my $name = $service->{'Name'}; my $display_name = $service->{'DisplayName'}; if (($service_name eq lc $name) || ($service_name eq lc $display_name)) { print "Setting mode for $name ($display_name) to $types{$type}..."; my $ret = $service->ChangeStartMode ($types{$type}); $ret == 0 or die "Unable to ChangeStartMode to $types{$type}: $ret"; print "done.\n"; } } } sub currtime { my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); return sprintf("[%02u/%02u/%u %02u:%02u:%02u]", $mon + 1, $mday, $year + 1900, $hour, $min, $sec); }