Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Job schedule task inventory

by shonorio (Hermit)
on Jun 28, 2006 at 14:35 UTC ( [id://558029]=sourcecode: print w/replies, xml ) Need Help??
Category: Win32
Author/Contact Info Solli Moreira Honorio (shonorioatperldotorgdotbr)
Description: Do a job inventory on all computers passed by command line, and output theses job information as tab format.
######################################################################
+##########
# Program     : Job Iventory
# Description : Do a job inventory on all computers passed by command 
+line, and
#               output theses job information as tab formated.
# Author      : Solli M. Honorio shonorio[at]perl[dot]org[dot]br
# License     : under the GPL (GNU Public License)
######################################################################
+##########

use Win32::TaskScheduler;
use strict;

######################################################################
+##########
######################## G L O B A L  V A R I A B L E S ##############
+##########
my %status_code = ( '267008' => 'Ready',
                    '267009' => 'Running',
                    '267010' => 'Disabled',
                    '267011' => 'Has not run',
                    '267012' => 'No more runs scheduled',
                    '267013' => 'Not scheduled',
                    '267014' => 'Terminated by User',
                    '267015' => 'No valid triggers',
                    '267016' => 'Event triggers dont have set run time
+s',
                    '267017' => 'Trigger not found',
                    '267018' => 'Properties not all set',
                    '267019' => 'No running task to terminate',
                    '267020' => 'Task scheduler not installed',
                    '267021' => 'Can not open task',
                    '267022' => 'Invalid task',
                    '267023' => 'No account information defined',
                    '267024' => 'Acount name not found',
                    '267025' => 'Account DB corrupt',
                    '267026' => 'Security services only on NT',
                    '267027' => 'Unknown object version' );

my %trigger_type = ( 0 => 'Once',
                     1 => 'Daily',
                     2 => 'Weekly',
                     3 => 'Monthly Date',
                     4 => 'Monthly Dow',
                     5 => 'On idle',
                     6 => 'At SystemStart',
                     7 => 'At Logon');

my %days_of_week = ( '01' => 'Sunday',
                     '02' => 'Monday',
                     '04' => 'Tuesday',
                     '08' => 'Wednesday',
                     '16' => 'Thursday',
                     '32' => 'Friday',
                     '64' => 'Saturday');

my %months       = ( '0001' => 'January',
                     '0002' => 'February',
                     '0004' => 'March',
                     '0008' => 'April',
                     '0016' => 'May',
                     '0032' => 'June',
                     '0064' => 'July',
                     '0128' => 'August',
                     '0256' => 'September',
                     '0512' => 'October',
                     '1024' => 'November',
                     '2048' => 'December');

my %which_week = (  1 => 'Fist week',
                    2 => 'Second week',
                    3 => 'Third week',
                    4 => 'Fourth week',
                    5 => 'Last week' );

######################## G L O B A L  V A R I A B L E S ##############
+##########
######################################################################
+##########

######################################################################
+##########
####################### D O   J O B   I N V E N T O R Y ##############
+##########
my %jobs_processed;
for ( @ARGV ) {
    if ( my @array = get_job_info ($_) ) {
        @{$jobs_processed{$_}} = @array;
    }
}
####################### D O   J O B   I N V E N T O R Y ##############
+##########
######################################################################
+##########

######################################################################
+##########
###################### O U T P U T   I N F O R M A T I O N ###########
+##########
print "Computer\t";
print "Job_Name\t";
print "Application_Name\t";
print "Parameters\t";
print "WorkDirectory\t";
print "Comment\t";
print "MostRecentRunTime\t";
print "NextRunTime\t";
print "MaxRunTime\t";
print "Priority\t";
print "Status\t";
print "User\t";
print "Creator\t";
print "Error\t";
print "Flag_Delete when done\t";
print "Flag_Disabled}\t";
print "Flag_Dont start if on batteries\t";
print "Flag_Hidden\t";
print "Flag_Interactive\t";
print "Flag_Kill if going on batteries\t";
print "Flag_Kill on idle end\t";
print "Flag_Restart on idle resume\t";
print "Flag_Run if connected to internet\t";
print "Flag_Run only if docked\t";
print "Flag_Start only if idle\t";
print "Flag_System required\t";
print "Trigger_String\t";
print "Trigger_Type\t";
print "Trigger_StartDay\t";
print "Trigger_EndDay\t";
print "Trigger_StartTime\t";
print "Trigger_Duration\t";
print "Trigger_Interval\t";
print "Trigger_Schedule_DaysInterval\t";
print "Trigger_Schedule_WeeksInterval\t";
print "Trigger_Schedule_WeeksDays\t";
print "Trigger_Schedule_Days\t";
print "Trigger_Schedule_WhichWeek\t";
print "Trigger_Schedule_Months\n";


foreach my $cp ( sort keys %jobs_processed ) {
    foreach my $job ( @{$jobs_processed{$cp}} ) {
        foreach my $idx ( sort keys %{$job->{Trigger}} ) {
            print "$cp\t";
            print "$job->{Name}\t";
            print "$job->{AppName}\t";
            print "$job->{Parameters}\t";
            print "$job->{WorkDirectory}\t";
            print "$job->{Comment}\t";
            print "$job->{MostRecentRunTime}\t";
            print "$job->{NextRunTime}\t";
            print "$job->{MaxRunTime}\t";
            print "$job->{Priority}\t";
            print "$job->{Status}\t";
            print "$job->{User}\t";
            print "$job->{Creator}\t";
            print "$job->{Error}\t";
            print "$job->{Flag}->{'Delete when done'}\t";
            print "$job->{Flag}->{Disabled}\t";
            print "$job->{Flag}->{'Dont start if on batteries'}\t";
            print "$job->{Flag}->{Hidden}\t";
            print "$job->{Flag}->{Interactive}\t";
            print "$job->{Flag}->{'Kill if going on batteries'}\t";
            print "$job->{Flag}->{'Kill on idle end'}\t";
            print "$job->{Flag}->{'Restart on idle resume'}\t";
            print "$job->{Flag}->{'Run if connected to internet'}\t";
            print "$job->{Flag}->{'Run only if docked'}\t";
            print "$job->{Flag}->{'Start only if idle'}\t";
            print "$job->{Flag}->{'System required'}\t";
            print "$job->{Trigger}{$idx}{String}\t";
            print "$job->{Trigger}{$idx}{Type}\t";
            print "$job->{Trigger}{$idx}{StartDay}\t";
            print "$job->{Trigger}{$idx}{EndDay}\t";
            print "$job->{Trigger}{$idx}{StartTime}\t";
            print "$job->{Trigger}{$idx}{Duration}\t";
            print "$job->{Trigger}{$idx}{Interval}\t";
            print "$job->{Trigger}{$idx}{Schedule}{DaysInterval}\t";
            print "$job->{Trigger}{$idx}{Schedule}{WeeksInterval}\t";
            print "$job->{Trigger}{$idx}{Schedule}{WeeksDays}\t";
            print "$job->{Trigger}{$idx}{Schedule}{Days}\t";
            print "$job->{Trigger}{$idx}{Schedule}{WhichWeek}\t";
            print "$job->{Trigger}{$idx}{Schedule}{Months}\n";
        }
    }
}
###################### O U T P U T   I N F O R M A T I O N ###########
+##########
######################################################################
+##########

sub get_job_info {
    my $computer_name = shift;
    my $scheduler     = Win32::TaskScheduler->New();
    my @jobs;
    
    if ( $scheduler->SetTargetComputer("\\\\$computer_name") ) {
        foreach my $job_name ( $scheduler->Enum() ) {
            my %job;
            $job_name  =~ s/\.job$//i;
            $job{Name} = $job_name;
        
            if ( $scheduler->Activate($job{Name}) ) {
                my ( $pri, $status, $error, $flags, $time_milli_second
+s );

                $scheduler->GetPriority($pri);
                $scheduler->GetStatus($status);
                $scheduler->GetExitCode($error);
                $flags = $scheduler->GetFlags();

                $job{Flag}{'Interactive'}                  = ( $flags 
+& $scheduler->TASK_FLAG_INTERACTIVE ) ? 1 : 0;
                $job{Flag}{'Delete when done'}             = ( $flags 
+& $scheduler->TASK_FLAG_DELETE_WHEN_DONE ) ? 1 : 0;
                $job{Flag}{'Disabled'}                     = ( $flags 
+& $scheduler->TASK_FLAG_DISABLED ) ? 1 : 0;
                $job{Flag}{'Start only if idle'}           = ( $flags 
+& $scheduler->TASK_FLAG_START_ONLY_IF_IDLE ) ? 1 : 0;
                $job{Flag}{'Kill on idle end'}             = ( $flags 
+& $scheduler->TASK_FLAG_KILL_ON_IDLE_END ) ? 1 : 0;
                $job{Flag}{'Dont start if on batteries'}   = ( $flags 
+& $scheduler->TASK_FLAG_DONT_START_IF_ON_BATTERIES ) ? 1 : 0;
                $job{Flag}{'Kill if going on batteries'}   = ( $flags 
+& $scheduler->TASK_FLAG_KILL_IF_GOING_ON_BATTERIES ) ? 1 : 0;
                $job{Flag}{'Run only if docked'}           = ( $flags 
+& $scheduler->TASK_FLAG_RUN_ONLY_IF_DOCKED ) ? 1 : 0;
                $job{Flag}{'Hidden'}                       = ( $flags 
+& $scheduler->TASK_FLAG_HIDDEN ) ? 1 : 0;
                $job{Flag}{'Run if connected to internet'} = ( $flags 
+& $scheduler->TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET ) ? 1 : 0;
                $job{Flag}{'Restart on idle resume'}       = ( $flags 
+& $scheduler->TASK_FLAG_RESTART_ON_IDLE_RESUME ) ? 1 : 0;
                $job{Flag}{'System required'}              = ( $flags 
+& $scheduler->TASK_FLAG_SYSTEM_REQUIRED ) ? 1 : 0;

                if ( $pri eq $scheduler->REALTIME_PRIORITY_CLASS ) {
                    $job{Priority} = 'Real time';
                } elsif ( $pri eq $scheduler->HIGH_PRIORITY_CLASS ) {
                    $job{Priority} = 'High';
                } elsif ( $pri eq $scheduler->NORMAL_PRIORITY_CLASS ) 
+{
                    $job{Priority} = 'Normal';
                } elsif ( $pri eq $scheduler->IDLE_PRIORITY_CLASS ) {
                    $job{Priority} = 'Idle';
                } else {
                    $job{Priority} = 'Unknown';
                }
            
                $job{User}              = $scheduler->GetAccountInform
+ation();
                $job{AppName}           = $scheduler->GetApplicationNa
+me();
                $job{Parameters}        = $scheduler->GetParameters();
                $job{WorkDirectory}     = $scheduler->GetWorkingDirect
+ory();
                $job{Status}            = $status_code{$status};
                $job{Error}             = $error;
                $job{Comment}           = $scheduler->GetComment();
                $job{Creator}           = $scheduler->GetCreator();
                $job{NextRunTime}       = format_hour($scheduler->GetN
+extRunTime());
                $job{MostRecentRunTime} = format_hour($scheduler->GetM
+ostRecentRunTime());

                if ( ( $time_milli_seconds = $scheduler->GetMaxRunTime
+() ) > -1 ) {
                    my ($hours, $minutes, $secounds);
                    $secounds = $time_milli_seconds / 1000;
                    $hours    = int ( $secounds / 3600 );
                    $minutes  = int ( ( $secounds - ( $hours * 3600 ) 
+) / 60 );
                    $secounds = int ( ( $secounds - ( ( $hours * 3600 
+) + ( $minutes * 60 ) ) ) );
                    $job{MaxRunTime} = sprintf "%d:%02d:%02d",$hours,$
+minutes,$secounds;
                }

                for ( my $idx = 0; $idx < $scheduler->GetTriggerCount(
+); $idx++ ) {
                    my ( %trigger );

                    $scheduler->GetTrigger( $idx, \%trigger );
                    $job{Trigger}{$idx}{String}    = $scheduler->GetTr
+iggerString($idx);
                    $job{Trigger}{$idx}{Type}      = $trigger_type{$tr
+igger{"TriggerType"}};
                    $job{Trigger}{$idx}{StartDay}  = sprintf "%04d-%02
+d-%02d", $trigger{BeginYear}, $trigger{BeginMonth}, $trigger{BeginDay
+};
                    $job{Trigger}{$idx}{EndDay}    = sprintf "%04d-%02
+d-%02d", $trigger{EndYear}, $trigger{EndMonth}, $trigger{EndDay};
                    $job{Trigger}{$idx}{StartTime} = sprintf "%02d:%02
+d", $trigger{StartHour}, $trigger{StartMinute};
                    $job{Trigger}{$idx}{Duration}  = sprintf "%02d:%02
+d", ( int $trigger{MinutesDuration} / 60 ),
                                                                      
+    ( $trigger{MinutesDuration} - ( ( int $trigger{MinutesDuration} /
+ 60 ) ) * 60 );
                    $job{Trigger}{$idx}{Interval}  = sprintf "%02d:%02
+d", ( int $trigger{MinutesInterval} / 60 ),
                                                                      
+    ( $trigger{MinutesInterval} - ( ( int $trigger{MinutesInterval} /
+ 60 ) ) * 60 );
                    if ( $trigger{"Type"} ) {
                        # build a schedule structure
                        if ( $trigger{'TriggerType'} == $scheduler->TA
+SK_TIME_TRIGGER_DAILY ) {
                            $job{Trigger}{$idx}{Schedule}{DaysInterval
+} = $trigger{'Type'}{DaysInterval};
                        } elsif ( $trigger{'TriggerType'} == $schedule
+r->TASK_TIME_TRIGGER_WEEKLY ) {
                            $job{Trigger}{$idx}{Schedule}{WeeksInterva
+l} = $trigger{'Type'}{WeeksInterval};
                            # do a loop and return the list of week da
+ys
                            $job{Trigger}{$idx}{Schedule}{WeeksDays}  
+   = join ',', map { ( $_ & $trigger{'Type'}{DaysOfTheWeek} ) ? $days
+_of_week{$_} : () } sort keys %days_of_week;
                        } elsif ( $trigger{"TriggerType"} == $schedule
+r->TASK_TIME_TRIGGER_MONTHLYDATE ) {
                            $job{Trigger}{$idx}{Schedule}{Days}   = $t
+rigger{'Type'}{Days};
                            # do a loop and return the list of months
                            $job{Trigger}{$idx}{Schedule}{Months} = jo
+in ',', map { ( $_ & $trigger{'Type'}{Months} ) ? $months{$_} : () } 
+sort keys %months;
                        } elsif ( $trigger{"TriggerType"} == $schedule
+r->TASK_TIME_TRIGGER_MONTHLYDOW ) {
                            $job{Trigger}{$idx}{Schedule}{WhichWeek} =
+ $which_week{$trigger{'Type'}{WhichWeek}}; 
                            $job{Trigger}{$idx}{Schedule}{WeeksDays} =
+ $days_of_week{$trigger{'Type'}{DaysOfTheWeek}};
                            # do a loop and return the list of months
                            $job{Trigger}{$idx}{Schedule}{Months} = jo
+in ',', map { ( $_ & $trigger{'Type'}{Months} ) ? $months{$_} : () } 
+sort keys %months;
                        }
                    }
                }
                push @jobs, \%job;
            } else {
                print STDERR "Could not activate the job $job{Name} at
+ computer $computer_name\n";
            }
        }
        $scheduler->End();
        return @jobs;
    } else {
        print STDERR "Could not connect the computer $computer_name\n"
+;
        return ();
    }
}

sub format_hour {
    my ($ms, $sec, $min, $hour, $day, $dayofweek, $month, $year) = @_;
    return sprintf "%04d-%02d-%02d %02d:%02d:%02d",$year,$month,$day,$
+hour,$min,$sec;
}
Replies are listed 'Best First'.
A reply falls below the community's threshold of quality. You may see it by logging in.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: sourcecode [id://558029]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (3)
As of 2024-04-24 23:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found