Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??
###################################################################### +########## # 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; }

In reply to Job schedule task inventory by shonorio

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (3)
As of 2024-03-29 01:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found