Class: Win32::TaskScheduler

Inherits:
Object
  • Object
show all
Includes:
Windows::TaskSchedulerConstants, Windows::TaskSchedulerHelper, Windows::TimeCalcHelper
Defined in:
lib/win32/taskscheduler.rb,
lib/win32/taskscheduler/version.rb

Overview

The TaskScheduler class encapsulates a Windows scheduled task

Defined Under Namespace

Classes: Error

Constant Summary collapse

IDLE =

Shorthand constants

IDLE_PRIORITY_CLASS
NORMAL =
NORMAL_PRIORITY_CLASS
HIGH =
HIGH_PRIORITY_CLASS
REALTIME =
REALTIME_PRIORITY_CLASS
BELOW_NORMAL =
BELOW_NORMAL_PRIORITY_CLASS
ABOVE_NORMAL =
ABOVE_NORMAL_PRIORITY_CLASS
ONCE =
TASK_TIME_TRIGGER_ONCE
DAILY =
TASK_TIME_TRIGGER_DAILY
WEEKLY =
TASK_TIME_TRIGGER_WEEKLY
MONTHLYDATE =
TASK_TIME_TRIGGER_MONTHLYDATE
MONTHLYDOW =
TASK_TIME_TRIGGER_MONTHLYDOW
ON_IDLE =
TASK_EVENT_TRIGGER_ON_IDLE
AT_SYSTEMSTART =
TASK_EVENT_TRIGGER_AT_SYSTEMSTART
AT_LOGON =
TASK_EVENT_TRIGGER_AT_LOGON
FIRST_WEEK =
TASK_FIRST_WEEK
SECOND_WEEK =
TASK_SECOND_WEEK
THIRD_WEEK =
TASK_THIRD_WEEK
FOURTH_WEEK =
TASK_FOURTH_WEEK
LAST_WEEK =
TASK_LAST_WEEK
SUNDAY =
TASK_SUNDAY
MONDAY =
TASK_MONDAY
TUESDAY =
TASK_TUESDAY
WEDNESDAY =
TASK_WEDNESDAY
THURSDAY =
TASK_THURSDAY
FRIDAY =
TASK_FRIDAY
SATURDAY =
TASK_SATURDAY
JANUARY =
TASK_JANUARY
FEBRUARY =
TASK_FEBRUARY
MARCH =
TASK_MARCH
APRIL =
TASK_APRIL
MAY =
TASK_MAY
JUNE =
TASK_JUNE
JULY =
TASK_JULY
AUGUST =
TASK_AUGUST
SEPTEMBER =
TASK_SEPTEMBER
OCTOBER =
TASK_OCTOBER
NOVEMBER =
TASK_NOVEMBER
DECEMBER =
TASK_DECEMBER
INTERACTIVE =
TASK_FLAG_INTERACTIVE
DELETE_WHEN_DONE =
TASK_FLAG_DELETE_WHEN_DONE
DISABLED =
TASK_FLAG_DISABLED
START_ONLY_IF_IDLE =
TASK_FLAG_START_ONLY_IF_IDLE
KILL_ON_IDLE_END =
TASK_FLAG_KILL_ON_IDLE_END
DONT_START_IF_ON_BATTERIES =
TASK_FLAG_DONT_START_IF_ON_BATTERIES
KILL_IF_GOING_ON_BATTERIES =
TASK_FLAG_KILL_IF_GOING_ON_BATTERIES
RUN_ONLY_IF_DOCKED =
TASK_FLAG_RUN_ONLY_IF_DOCKED
HIDDEN =
TASK_FLAG_HIDDEN
RUN_IF_CONNECTED_TO_INTERNET =
TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET
RESTART_ON_IDLE_RESUME =
TASK_FLAG_RESTART_ON_IDLE_RESUME
SYSTEM_REQUIRED =
TASK_FLAG_SYSTEM_REQUIRED
RUN_ONLY_IF_LOGGED_ON =
TASK_FLAG_RUN_ONLY_IF_LOGGED_ON
FLAG_HAS_END_DATE =
TASK_TRIGGER_FLAG_HAS_END_DATE
FLAG_KILL_AT_DURATION_END =
TASK_TRIGGER_FLAG_KILL_AT_DURATION_END
FLAG_DISABLED =
TASK_TRIGGER_FLAG_DISABLED
MAX_RUN_TIMES =
TASK_MAX_RUN_TIMES
FIRST =
TASK_FIRST
SECOND =
TASK_SECOND
THIRD =
TASK_THIRD
FOURTH =
TASK_FOURTH
FIFTH =
TASK_FIFTH
SIXTH =
TASK_SIXTH
SEVENTH =
TASK_SEVENTH
EIGHTH =
TASK_EIGHTH
NINETH =
TASK_NINETH
TENTH =
TASK_TENTH
ELEVENTH =
TASK_ELEVENTH
TWELFTH =
TASK_TWELFTH
THIRTEENTH =
TASK_THIRTEENTH
FOURTEENTH =
TASK_FOURTEENTH
FIFTEENTH =
TASK_FIFTEENTH
SIXTEENTH =
TASK_SIXTEENTH
SEVENTEENTH =
TASK_SEVENTEENTH
EIGHTEENTH =
TASK_EIGHTEENTH
NINETEENTH =
TASK_NINETEENTH
TWENTIETH =
TASK_TWENTIETH
TWENTY_FIRST =
TASK_TWENTY_FIRST
TWENTY_SECOND =
TASK_TWENTY_SECOND
TWENTY_THIRD =
TASK_TWENTY_THIRD
TWENTY_FOURTH =
TASK_TWENTY_FOURTH
TWENTY_FIFTH =
TASK_TWENTY_FIFTH
TWENTY_SIXTH =
TASK_TWENTY_SIXTH
TWENTY_SEVENTH =
TASK_TWENTY_SEVENTH
TWENTY_EIGHTH =
TASK_TWENTY_EIGHTH
TWENTY_NINTH =
TASK_TWENTY_NINTH
THIRTYETH =
TASK_THIRTYETH
THIRTY_FIRST =
TASK_THIRTY_FIRST
LAST =
TASK_LAST
VERSION =

The version of the win32-taskscheduler library

'1.0.9'.freeze

Constants included from Windows::TaskSchedulerConstants

Windows::TaskSchedulerConstants::ABOVE_NORMAL_PRIORITY_CLASS, Windows::TaskSchedulerConstants::BELOW_NORMAL_PRIORITY_CLASS, Windows::TaskSchedulerConstants::CLSCTX_INPROC_SERVER, Windows::TaskSchedulerConstants::CLSID_CTask, Windows::TaskSchedulerConstants::CLSID_CTaskScheduler, Windows::TaskSchedulerConstants::HIGH_PRIORITY_CLASS, Windows::TaskSchedulerConstants::IDLE_PRIORITY_CLASS, Windows::TaskSchedulerConstants::IID_IPersistFile, Windows::TaskSchedulerConstants::IID_ITask, Windows::TaskSchedulerConstants::IID_ITaskScheduler, Windows::TaskSchedulerConstants::NORMAL_PRIORITY_CLASS, Windows::TaskSchedulerConstants::REALTIME_PRIORITY_CLASS, Windows::TaskSchedulerConstants::SYSTEM_USERS, Windows::TaskSchedulerConstants::TASKS_TO_RETRIEVE, Windows::TaskSchedulerConstants::TASK_APRIL, Windows::TaskSchedulerConstants::TASK_AUGUST, Windows::TaskSchedulerConstants::TASK_CREATE, Windows::TaskSchedulerConstants::TASK_CREATE_OR_UPDATE, Windows::TaskSchedulerConstants::TASK_DECEMBER, Windows::TaskSchedulerConstants::TASK_DISABLE, Windows::TaskSchedulerConstants::TASK_DONT_ADD_PRINCIPAL_ACE, Windows::TaskSchedulerConstants::TASK_EIGHTEENTH, Windows::TaskSchedulerConstants::TASK_EIGHTH, Windows::TaskSchedulerConstants::TASK_ELEVENTH, Windows::TaskSchedulerConstants::TASK_EVENT_TRIGGER_AT_LOGON, Windows::TaskSchedulerConstants::TASK_EVENT_TRIGGER_AT_SYSTEMSTART, Windows::TaskSchedulerConstants::TASK_EVENT_TRIGGER_ON_IDLE, Windows::TaskSchedulerConstants::TASK_FEBRUARY, Windows::TaskSchedulerConstants::TASK_FIFTEENTH, Windows::TaskSchedulerConstants::TASK_FIFTH, Windows::TaskSchedulerConstants::TASK_FIRST, Windows::TaskSchedulerConstants::TASK_FIRST_WEEK, Windows::TaskSchedulerConstants::TASK_FLAG_DELETE_WHEN_DONE, Windows::TaskSchedulerConstants::TASK_FLAG_DISABLED, Windows::TaskSchedulerConstants::TASK_FLAG_DONT_START_IF_ON_BATTERIES, Windows::TaskSchedulerConstants::TASK_FLAG_HIDDEN, Windows::TaskSchedulerConstants::TASK_FLAG_INTERACTIVE, Windows::TaskSchedulerConstants::TASK_FLAG_KILL_IF_GOING_ON_BATTERIES, Windows::TaskSchedulerConstants::TASK_FLAG_KILL_ON_IDLE_END, Windows::TaskSchedulerConstants::TASK_FLAG_RESTART_ON_IDLE_RESUME, Windows::TaskSchedulerConstants::TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET, Windows::TaskSchedulerConstants::TASK_FLAG_RUN_ONLY_IF_DOCKED, Windows::TaskSchedulerConstants::TASK_FLAG_RUN_ONLY_IF_LOGGED_ON, Windows::TaskSchedulerConstants::TASK_FLAG_START_ONLY_IF_IDLE, Windows::TaskSchedulerConstants::TASK_FLAG_SYSTEM_REQUIRED, Windows::TaskSchedulerConstants::TASK_FOURTEENTH, Windows::TaskSchedulerConstants::TASK_FOURTH, Windows::TaskSchedulerConstants::TASK_FOURTH_WEEK, Windows::TaskSchedulerConstants::TASK_FRIDAY, Windows::TaskSchedulerConstants::TASK_IGNORE_REGISTRATION_TRIGGERS, Windows::TaskSchedulerConstants::TASK_JANUARY, Windows::TaskSchedulerConstants::TASK_JULY, Windows::TaskSchedulerConstants::TASK_JUNE, Windows::TaskSchedulerConstants::TASK_LAST, Windows::TaskSchedulerConstants::TASK_LAST_WEEK, Windows::TaskSchedulerConstants::TASK_LOGON_GROUP, Windows::TaskSchedulerConstants::TASK_LOGON_INTERACTIVE_TOKEN, Windows::TaskSchedulerConstants::TASK_LOGON_INTERACTIVE_TOKEN_OR_PASSWORD, Windows::TaskSchedulerConstants::TASK_LOGON_NONE, Windows::TaskSchedulerConstants::TASK_LOGON_PASSWORD, Windows::TaskSchedulerConstants::TASK_LOGON_S4U, Windows::TaskSchedulerConstants::TASK_LOGON_SERVICE_ACCOUNT, Windows::TaskSchedulerConstants::TASK_MARCH, Windows::TaskSchedulerConstants::TASK_MAX_RUN_TIMES, Windows::TaskSchedulerConstants::TASK_MAY, Windows::TaskSchedulerConstants::TASK_MONDAY, Windows::TaskSchedulerConstants::TASK_NINETEENTH, Windows::TaskSchedulerConstants::TASK_NINETH, Windows::TaskSchedulerConstants::TASK_NOVEMBER, Windows::TaskSchedulerConstants::TASK_OCTOBER, Windows::TaskSchedulerConstants::TASK_RUNLEVEL_HIGHEST, Windows::TaskSchedulerConstants::TASK_RUNLEVEL_LUA, Windows::TaskSchedulerConstants::TASK_SATURDAY, Windows::TaskSchedulerConstants::TASK_SECOND, Windows::TaskSchedulerConstants::TASK_SECOND_WEEK, Windows::TaskSchedulerConstants::TASK_SEPTEMBER, Windows::TaskSchedulerConstants::TASK_SEVENTEENTH, Windows::TaskSchedulerConstants::TASK_SEVENTH, Windows::TaskSchedulerConstants::TASK_SIXTEENTH, Windows::TaskSchedulerConstants::TASK_SIXTH, Windows::TaskSchedulerConstants::TASK_SUNDAY, Windows::TaskSchedulerConstants::TASK_TENTH, Windows::TaskSchedulerConstants::TASK_THIRD, Windows::TaskSchedulerConstants::TASK_THIRD_WEEK, Windows::TaskSchedulerConstants::TASK_THIRTEENTH, Windows::TaskSchedulerConstants::TASK_THIRTYETH, Windows::TaskSchedulerConstants::TASK_THIRTY_FIRST, Windows::TaskSchedulerConstants::TASK_THURSDAY, Windows::TaskSchedulerConstants::TASK_TIME_TRIGGER_DAILY, Windows::TaskSchedulerConstants::TASK_TIME_TRIGGER_MONTHLYDATE, Windows::TaskSchedulerConstants::TASK_TIME_TRIGGER_MONTHLYDOW, Windows::TaskSchedulerConstants::TASK_TIME_TRIGGER_ONCE, Windows::TaskSchedulerConstants::TASK_TIME_TRIGGER_WEEKLY, Windows::TaskSchedulerConstants::TASK_TRIGGER_FLAG_DISABLED, Windows::TaskSchedulerConstants::TASK_TRIGGER_FLAG_HAS_END_DATE, Windows::TaskSchedulerConstants::TASK_TRIGGER_FLAG_KILL_AT_DURATION_END, Windows::TaskSchedulerConstants::TASK_TRIGGER_REGISTRATION, Windows::TaskSchedulerConstants::TASK_TRIGGER_SESSION_STATE_CHANGE, Windows::TaskSchedulerConstants::TASK_TUESDAY, Windows::TaskSchedulerConstants::TASK_TWELFTH, Windows::TaskSchedulerConstants::TASK_TWENTIETH, Windows::TaskSchedulerConstants::TASK_TWENTY_EIGHTH, Windows::TaskSchedulerConstants::TASK_TWENTY_FIFTH, Windows::TaskSchedulerConstants::TASK_TWENTY_FIRST, Windows::TaskSchedulerConstants::TASK_TWENTY_FOURTH, Windows::TaskSchedulerConstants::TASK_TWENTY_NINTH, Windows::TaskSchedulerConstants::TASK_TWENTY_SECOND, Windows::TaskSchedulerConstants::TASK_TWENTY_SEVENTH, Windows::TaskSchedulerConstants::TASK_TWENTY_SIXTH, Windows::TaskSchedulerConstants::TASK_TWENTY_THIRD, Windows::TaskSchedulerConstants::TASK_UPDATE, Windows::TaskSchedulerConstants::TASK_VALIDATE_ONLY, Windows::TaskSchedulerConstants::TASK_WEDNESDAY

Constants included from Windows::TimeCalcHelper

Windows::TimeCalcHelper::DAYS_IN_A_MONTH

Constants included from Windows::TaskSchedulerHelper

Windows::TaskSchedulerHelper::FORMAT_MESSAGE_FROM_SYSTEM, Windows::TaskSchedulerHelper::FORMAT_MESSAGE_IGNORE_INSERTS, Windows::TaskSchedulerHelper::FORMAT_MESSAGE_MAX_WIDTH_MASK

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Windows::TimeCalcHelper

#days_in_month, #dt_tm_array_to_hash, #extra_days, #extra_months, #extra_time, #is_leap_year?, #time_details, #time_in_minutes, #time_in_seconds

Methods included from Windows::TaskSchedulerHelper

#ole_error, #win_error

Constructor Details

#initialize(task = nil, trigger = nil, folder = root_path, force = false) ⇒ TaskScheduler

Returns a new TaskScheduler object, attached to folder. If that folder does not exist, but the force option is set to true, then it will be created. Otherwise an error will be raised. The default is to use the root folder.

If task and trigger are present, then a new task is generated as well. This is effectively the same as .new + #new_work_item.

Raises:

  • (ArgumentError)


137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/win32/taskscheduler.rb', line 137

def initialize(task = nil, trigger = nil, folder = root_path, force = false)
  @folder = folder
  @force  = force

  @host     = Socket.gethostname
  @task     = nil
  @password = nil

  raise ArgumentError, "invalid folder" unless folder.include?("\\")

  unless [TrueClass, FalseClass].include?(force.class)
    raise TypeError, "invalid force value"
  end

  begin
    @service = WIN32OLE.new('Schedule.Service')
  rescue WIN32OLERuntimeError => err
    raise Error, err.inspect
  end

  @service.Connect

  if folder != root_path
    begin
      @root = @service.GetFolder(folder)
    rescue WIN32OLERuntimeError => err
      if force
        @root = @service.GetFolder(root_path)
        @root = @root.CreateFolder(folder)
      else
        raise ArgumentError, "folder '#{folder}' not found"
      end
    end
  else
    @root = @service.GetFolder(folder)
  end

  if task && trigger
    new_work_item(task, trigger)
  end
end

Instance Attribute Details

#hostObject (readonly) Also known as: machine

Returns the value of attribute host.



122
123
124
# File 'lib/win32/taskscheduler.rb', line 122

def host
  @host
end

#passwordObject

:startdoc:



121
122
123
# File 'lib/win32/taskscheduler.rb', line 121

def password
  @password
end

Instance Method Details

#account_informationObject

Returns the user associated with the task or nil if no user has yet been associated with the task.



362
363
364
# File 'lib/win32/taskscheduler.rb', line 362

def 
  @task.nil? ? nil : @task.Definition.Principal.UserId
end

#activate(task) ⇒ Object

Activate the specified task.

Raises:

  • (TypeError)


245
246
247
248
249
250
251
252
253
254
255
# File 'lib/win32/taskscheduler.rb', line 245

def activate(task)
  raise TypeError unless task.is_a?(String)

  begin
    registeredTask = @root.GetTask(task)
    registeredTask.Enabled = 1
    @task = registeredTask
  rescue WIN32OLERuntimeError => err
    raise Error, ole_error('activate', err)
  end
end

#add_trigger(index, trigger) ⇒ Object

Adds a trigger at the specified index.

Raises:

  • (TypeError)


872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
# File 'lib/win32/taskscheduler.rb', line 872

def add_trigger(index, trigger)
  raise TypeError unless index.is_a?(Numeric)
  raise TypeError unless trigger.is_a?(Hash)
  raise ArgumentError, 'Unknown trigger type' unless valid_trigger_option(trigger[:trigger_type])

  check_for_active_task

  definition = @task.Definition

  startTime = "%04d-%02d-%02dT%02d:%02d:00" % [
    trigger[:start_year], trigger[:start_month], trigger[:start_day],
    trigger[:start_hour], trigger[:start_minute]
  ]

  # Set defaults
  trigger[:end_year]  ||= 0
  trigger[:end_month] ||= 0
  trigger[:end_day]   ||= 0

  endTime = "%04d-%02d-%02dT00:00:00" % [
    trigger[:end_year], trigger[:end_month], trigger[:end_day]
  ]

  trig = definition.Triggers.Create( trigger[:trigger_type].to_i )
  trig.Id = "RegistrationTriggerId#{definition.Triggers.Count}"
  trig.StartBoundary = startTime if startTime != '0000-00-00T00:00:00'
  trig.EndBoundary = endTime if endTime != '0000-00-00T00:00:00'
  trig.Enabled = true

  repetitionPattern = trig.Repetition

  if trigger[:minutes_duration].to_i > 0
    repetitionPattern.Duration = "PT#{trigger[:minutes_duration]||0}M"
  end

  if trigger[:minutes_interval].to_i > 0
    repetitionPattern.Interval  = "PT#{trigger[:minutes_interval]||0}M"
  end

  tmp = trigger[:type]
  tmp = nil unless tmp.is_a?(Hash)

  case trigger[:trigger_type]
    when TASK_TIME_TRIGGER_DAILY
      trig.DaysInterval = tmp[:days_interval] if tmp && tmp[:days_interval]
      if trigger[:random_minutes_interval].to_i > 0
      trig.RandomDelay = "PT#{trigger[:random_minutes_interval]}M"
      end
    when TASK_TIME_TRIGGER_WEEKLY
      trig.DaysOfWeek = tmp[:days_of_week] if tmp && tmp[:days_of_week]
      trig.WeeksInterval = tmp[:weeks_interval] if tmp && tmp[:weeks_interval]
      if trigger[:random_minutes_interval].to_i > 0
      trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
      end
    when TASK_TIME_TRIGGER_MONTHLYDATE
      trig.MonthsOfYear = tmp[:months] if tmp && tmp[:months]
      trig.DaysOfMonth = tmp[:days] if tmp && tmp[:days]
      if trigger[:random_minutes_interval].to_i > 0
        trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
      end
      trig.RunOnLastDayOfMonth = trigger[:run_on_last_day_of_month] if trigger[:run_on_last_day_of_month]
    when TASK_TIME_TRIGGER_MONTHLYDOW
      trig.MonthsOfYear  = tmp[:months] if tmp && tmp[:months]
      trig.DaysOfWeek  = tmp[:days_of_week] if tmp && tmp[:days_of_week]
      trig.WeeksOfMonth  = tmp[:weeks_of_month] if tmp && tmp[:weeks_of_month]
      if trigger[:random_minutes_interval].to_i > 0
      trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
      end
      trig.RunOnLastWeekOfMonth = trigger[:run_on_last_week_of_month] if trigger[:run_on_last_week_of_month]
    when TASK_TIME_TRIGGER_ONCE
      if trigger[:random_minutes_interval].to_i > 0
      trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
      end
    when TASK_EVENT_TRIGGER_AT_SYSTEMSTART
      trig.Delay = "PT#{trigger[:delay_duration]||0}M"
    when TASK_EVENT_TRIGGER_AT_LOGON
      trig.UserId = trigger[:user_id] if trigger[:user_id]
      trig.Delay = "PT#{trigger[:delay_duration]||0}M"
  end

  update_task_definition(definition)

  true
end

#application_nameObject

Returns the name of the application associated with the task. If no application is associated with the task then nil is returned.



369
370
371
372
373
374
375
376
377
378
379
380
381
382
# File 'lib/win32/taskscheduler.rb', line 369

def application_name
  check_for_active_task

  app = nil

  @task.Definition.Actions.each do |action|
    if action.Type == 0 # TASK_ACTION_EXEC
      app = action.Path
      break
    end
  end

  app
end

#application_name=(app) ⇒ Object

Sets the name of the application associated with the task.

Raises:

  • (TypeError)


386
387
388
389
390
391
392
393
394
395
396
397
398
399
# File 'lib/win32/taskscheduler.rb', line 386

def application_name=(app)
  raise TypeError unless app.is_a?(String)
  check_for_active_task

  definition = @task.Definition

  definition.Actions.each do |action|
    action.Path = app if action.Type == 0
  end

  update_task_definition(definition)

  app
end

#commentObject Also known as: description

Returns the comment associated with the task, if any.



994
995
996
997
# File 'lib/win32/taskscheduler.rb', line 994

def comment
  check_for_active_task
  @task.Definition.RegistrationInfo.Description
end

#comment=(comment) ⇒ Object Also known as: description=

Sets the comment for the task.

Raises:

  • (TypeError)


1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
# File 'lib/win32/taskscheduler.rb', line 1003

def comment=(comment)
  raise TypeError unless comment.is_a?(String)
  check_for_active_task

  definition = @task.Definition
  definition.RegistrationInfo.Description = comment
  update_task_definition(definition)

  comment
end

#configure_principals(principals) ⇒ Object

Sets the principals for current active task. The principal is hash with following possible options. Expected principal hash: { id: STRING, display_name: STRING, user_id: STRING, logon_type: INTEGER, group_id: STRING, run_level: INTEGER }

Raises:

  • (TypeError)


1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
# File 'lib/win32/taskscheduler.rb', line 1261

def configure_principals(principals)
  raise TypeError unless principals.is_a?(Hash)
  check_for_active_task
  definition = @task.Definition
  definition.Principal.Id = principals[:id] if principals[:id].to_s != ""
  definition.Principal.DisplayName = principals[:display_name] if principals[:display_name].to_s != ""
  definition.Principal.UserId = principals[:user_id] if principals[:user_id].to_s != ""
  definition.Principal.LogonType = principals[:logon_type] if principals[:logon_type].to_s != ""
  definition.Principal.GroupId = principals[:group_id] if principals[:group_id].to_s != ""
  definition.Principal.RunLevel = principals[:run_level] if principals[:run_level].to_s != ""
  update_task_definition(definition)
  principals
end

#configure_registration_info(hash) ⇒ Object

Set registration information options. The possible options are:

  • author

  • date

  • description (or comment)

  • documentation

  • security_descriptor (should be a Win32::Security::SID)

  • source

  • uri

  • version

  • xml_text (or xml)

Note that most of these options have standalone methods as well, e.g. calling ts.configure_registration_info(:author => ‘Dan’) is the same as calling ts.author = ‘Dan’.

Raises:

  • (TypeError)


1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
# File 'lib/win32/taskscheduler.rb', line 1226

def configure_registration_info(hash)
  raise TypeError unless hash.is_a?(Hash)
  check_for_active_task

  definition = @task.Definition

  author = hash[:author]
  date = hash[:date]
  description = hash[:description] || hash[:comment]
  documentation = hash[:documentation]
  security_descriptor = hash[:security_descriptor]
  source = hash[:source]
  uri = hash[:uri]
  version = hash[:version]
  xml_text = hash[:xml_text] || hash[:xml]

  definition.RegistrationInfo.Author = author if author
  definition.RegistrationInfo.Date = date if date
  definition.RegistrationInfo.Description = description if description
  definition.RegistrationInfo.Documentation = documentation if documentation
  definition.RegistrationInfo.SecurityDescriptor = security_descriptor if security_descriptor
  definition.RegistrationInfo.Source = source if source
  definition.RegistrationInfo.URI = uri if uri
  definition.RegistrationInfo.Version = version if version
  definition.RegistrationInfo.XmlText = xml_text if xml_text

  update_task_definition(definition)

  hash
end

#configure_settings(hash) ⇒ Object

Accepts a hash that lets you configure various task definition settings. The possible options are:

  • allow_demand_start

  • allow_hard_terminate

  • compatibility

  • delete_expired_task_after

  • disallowed_start_if_on_batteries

  • enabled

  • execution_time_limit (or max_run_time)

  • hidden

  • idle_settings

  • network_settings

  • priority

  • restart_count

  • restart_interval

  • run_only_if_idle

  • run_only_if_network_available

  • start_when_available

  • stop_if_going_on_batteries

  • wake_to_run

  • xml_text (or xml)

Raises:

  • (TypeError)


1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
# File 'lib/win32/taskscheduler.rb', line 1153

def configure_settings(hash)
  raise TypeError unless hash.is_a?(Hash)
  check_for_active_task

  definition = @task.Definition

  allow_demand_start = hash[:allow_demand_start]
  allow_hard_terminate = hash[:allow_hard_terminate]
  compatibility = hash[:compatibility]
  delete_expired_task_after = hash[:delete_expired_task_after]
  disallow_start_if_on_batteries = hash[:disallow_start_if_on_batteries]
  enabled = hash[:enabled]
  execution_time_limit = "PT#{hash[:execution_time_limit] || hash[:max_run_time] || 0}M"
  hidden = hash[:hidden]
  idle_duration = "PT#{hash[:idle_duration]||0}M"
  stop_on_idle_end = hash[:stop_on_idle_end]
  wait_timeout = "PT#{hash[:wait_timeout]||0}M"
  restart_on_idle = hash[:restart_on_idle]
  network_settings = hash[:network_settings]
  priority = hash[:priority]
  restart_count = hash[:restart_count]
  restart_interval = hash[:restart_interval]
  run_only_if_idle = hash[:run_only_if_idle]
  run_only_if_network_available = hash[:run_only_if_network_available]
  start_when_available = hash[:start_when_available]
  stop_if_going_on_batteries = hash[:stop_if_going_on_batteries]
  wake_to_run = hash[:wake_to_run]
  xml_text = hash[:xml_text] || hash[:xml]

  definition.Settings.AllowDemandStart = allow_demand_start if allow_demand_start
  definition.Settings.AllowHardTerminate = allow_hard_terminate if allow_hard_terminate
  definition.Settings.Compatibility = compatibility if compatibility
  definition.Settings.DeleteExpiredTaskAfter = delete_expired_task_after if delete_expired_task_after
  definition.Settings.DisallowStartIfOnBatteries = disallow_start_if_on_batteries if !disallow_start_if_on_batteries.nil?
  definition.Settings.Enabled = enabled if enabled
  definition.Settings.ExecutionTimeLimit = execution_time_limit if execution_time_limit
  definition.Settings.Hidden = hidden if hidden
  definition.Settings.IdleSettings.IdleDuration = idle_duration if idle_duration
  definition.Settings.IdleSettings.StopOnIdleEnd = stop_on_idle_end if stop_on_idle_end
  definition.Settings.IdleSettings.WaitTimeout = wait_timeout if wait_timeout
  definition.Settings.IdleSettings.RestartOnIdle = restart_on_idle if restart_on_idle
  definition.Settings.NetworkSettings = network_settings if network_settings
  definition.Settings.Priority = priority if priority
  definition.Settings.RestartCount = restart_count if restart_count
  definition.Settings.RestartInterval = restart_interval if restart_interval
  definition.Settings.RunOnlyIfIdle = run_only_if_idle if run_only_if_idle
  definition.Settings.RunOnlyIfNetworkAvailable = run_only_if_network_available if run_only_if_network_available
  definition.Settings.StartWhenAvailable = start_when_available if start_when_available
  definition.Settings.StopIfGoingOnBatteries  = stop_if_going_on_batteries if !stop_if_going_on_batteries.nil?
  definition.Settings.WakeToRun = wake_to_run if wake_to_run
  definition.Settings.XmlText = xml_text if xml_text

  update_task_definition(definition)

  hash
end

#creatorObject Also known as: author

Returns the name of the user who created the task.



1018
1019
1020
1021
# File 'lib/win32/taskscheduler.rb', line 1018

def creator
  check_for_active_task
  @task.Definition.RegistrationInfo.Author
end

#creator=(creator) ⇒ Object Also known as: author=

Sets the creator for the task.

Raises:

  • (TypeError)


1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
# File 'lib/win32/taskscheduler.rb', line 1027

def creator=(creator)
  raise TypeError unless creator.is_a?(String)
  check_for_active_task

  definition = @task.Definition
  definition.RegistrationInfo.Author = creator
  update_task_definition(definition)

  creator
end

#delete(task) ⇒ Object

Delete the specified task name.

Raises:

  • (TypeError)


259
260
261
262
263
264
265
266
267
# File 'lib/win32/taskscheduler.rb', line 259

def delete(task)
  raise TypeError unless task.is_a?(String)

  begin
    @root.DeleteTask(task, 0)
  rescue WIN32OLERuntimeError => err
    raise Error, ole_error('DeleteTask', err)
  end
end

#delete_trigger(index) ⇒ Object

Deletes the trigger at the specified index. – TODO: Fix.

Raises:

  • (TypeError)


675
676
677
678
679
680
681
682
683
684
685
# File 'lib/win32/taskscheduler.rb', line 675

def delete_trigger(index)
  raise TypeError unless index.is_a?(Numeric)
  check_for_active_task
  index += 1  # first item index is 1

  definition = @task.Definition
  definition.Triggers.Remove(index)
  update_task_definition(definition)

  index
end

#enabled?Boolean

Returns true if current task is enabled

Returns:

  • (Boolean)


980
981
982
983
# File 'lib/win32/taskscheduler.rb', line 980

def enabled?
  check_for_active_task
  @task.enabled
end

#enumObject Also known as: tasks

Returns an array of scheduled task names.



181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/win32/taskscheduler.rb', line 181

def enum
  # Get the task folder that contains the tasks.
  taskCollection = @root.GetTasks(0)

  array = []

  taskCollection.each do |registeredTask|
    array << registeredTask.Name
  end

  array
end

#execution_time_limitObject

Returns the execution time limit for current active task



1078
1079
1080
1081
# File 'lib/win32/taskscheduler.rb', line 1078

def execution_time_limit
  check_for_active_task
  @task.Definition.Settings.ExecutionTimeLimit
end

#exists?(full_task_path) ⇒ Boolean

Returns whether or not the specified task exists.

Returns:

  • (Boolean)


198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'lib/win32/taskscheduler.rb', line 198

def exists?(full_task_path)
  path = nil
  task_name = nil

  # Used the splat operator to put all folder elements into path and leave only the task name`
  if full_task_path.include?("\\")
    full_task_path = root_path + full_task_path
    *path, task_name = full_task_path.split('\\')
  else
    task_name = full_task_path
  end

  folder = path.nil? ? root_path : path.join("\\")

  begin
    root = @service.GetFolder(folder)
  rescue WIN32OLERuntimeError => err
    return false
  end

  if root.nil?
    return false
  else
    begin
      task = root.GetTask(task_name)
      return task && task.Name == task_name
    rescue WIN32OLERuntimeError => err
      return false
    end
  end
end

#exit_codeObject

Returns the exit code from the last scheduled run.



987
988
989
990
# File 'lib/win32/taskscheduler.rb', line 987

def exit_code
  check_for_active_task
  @task.LastTaskResult
end

#get_task(task) ⇒ Object

Return the sepcified task if exist

Raises:

  • (TypeError)


232
233
234
235
236
237
238
239
240
241
# File 'lib/win32/taskscheduler.rb', line 232

def get_task(task)
  raise TypeError unless task.is_a?(String)

  begin
    registeredTask = @root.GetTask(task)
    @task = registeredTask
  rescue WIN32OLERuntimeError => err
    raise Error, ole_error('activate', err)
  end
end

#idle_settingsObject

Returns a hash of idle settings of the current task



1066
1067
1068
1069
1070
1071
1072
1073
1074
# File 'lib/win32/taskscheduler.rb', line 1066

def idle_settings
  check_for_active_task
  idle_settings = {}
  idle_settings[:idle_duration] = @task.Definition.Settings.IdleSettings.IdleDuration
  idle_settings[:stop_on_idle_end] = @task.Definition.Settings.IdleSettings.StopOnIdleEnd
  idle_settings[:wait_timeout] = @task.Definition.Settings.IdleSettings.WaitTimeout
  idle_settings[:restart_on_idle] = @task.Definition.Settings.IdleSettings.RestartOnIdle
  idle_settings
end

#machine=(host) ⇒ Object Also known as: host=

Set the host on which the various TaskScheduler methods will execute. This method may require administrative privileges.

Raises:

  • (TypeError)


297
298
299
300
301
302
303
304
305
306
307
308
# File 'lib/win32/taskscheduler.rb', line 297

def machine=(host)
  raise TypeError unless host.is_a?(String)

  begin
    @service.Connect(host)
  rescue WIN32OLERuntimeError => err
    raise Error, ole_error('Connect', err)
  end

  @host = host
  host
end

#max_run_timeObject

Returns the maximum length of time, in milliseconds, that the task will run before terminating.



1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
# File 'lib/win32/taskscheduler.rb', line 1086

def max_run_time
  check_for_active_task

  t = @task.Definition.Settings.ExecutionTimeLimit
  year = t.scan(/(\d+?)Y/).flatten.first
  month = t.scan(/(\d+?)M/).flatten.first
  day = t.scan(/(\d+?)D/).flatten.first
  hour = t.scan(/(\d+?)H/).flatten.first
  min = t.scan(/T.*(\d+?)M/).flatten.first
  sec = t.scan(/(\d+?)S/).flatten.first

  time = 0
  time += year.to_i * 365 if year
  time += month.to_i * 30 if month
  time += day.to_i if day
  time *= 24
  time += hour.to_i if hour
  time *= 60
  time += min.to_i if min
  time *= 60
  time += sec.to_i if sec
  time *= 1000

  time
end

#max_run_time=(max_run_time) ⇒ Object

Sets the maximum length of time, in milliseconds, that the task can run before terminating. Returns the value you specified if successful.

Raises:

  • (TypeError)


1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
# File 'lib/win32/taskscheduler.rb', line 1115

def max_run_time=(max_run_time)
  raise TypeError unless max_run_time.is_a?(Numeric)
  check_for_active_task

  t = max_run_time
  t /= 1000
  limit ="PT#{t}S"

  definition = @task.Definition
  definition.Settings.ExecutionTimeLimit = limit
  update_task_definition(definition)

  max_run_time
end

#most_recent_run_timeObject

Returns a Time object indicating the most recent time the task ran or nil if the task has never run.



1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
# File 'lib/win32/taskscheduler.rb', line 1050

def most_recent_run_time
  check_for_active_task

  time = nil

  begin
    time = Time.parse(@task.LastRunTime)
  rescue
    # Ignore
  end

  time
end

#network_settingsObject

Returns a hash of network settings of the current task



1310
1311
1312
1313
1314
1315
1316
1317
# File 'lib/win32/taskscheduler.rb', line 1310

def network_settings
  check_for_active_task
  settings_hash = {}
  @task.Definition.Settings.NetworkSettings.ole_get_methods.each do |setting|
    settings_hash[setting.name] = @task.Definition.Settings.NetworkSettings._getproperty(setting.dispid, [], [])
  end
  symbolize_keys(settings_hash)
end

#new_work_item(task, trigger, userinfo = { user: nil, password: nil }) ⇒ Object Also known as: new_task

Creates a new work item (scheduled job) with the given trigger. The trigger variable is a hash of options that define when the scheduled job should run.

Raises:

  • (TypeError)


525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
# File 'lib/win32/taskscheduler.rb', line 525

def new_work_item(task, trigger, userinfo = { user: nil, password: nil })
  raise TypeError unless userinfo.is_a?(Hash)
  raise TypeError unless task.is_a?(String)
  raise TypeError unless trigger.is_a?(Hash)

  unless userinfo[:user].nil?
    raise TypeError unless userinfo[:user].is_a?(String)
    unless SYSTEM_USERS.include?(userinfo[:user])
      raise TypeError unless userinfo[:password].is_a?(String)
    end
  end

  taskDefinition = @service.NewTask(0)
  taskDefinition.RegistrationInfo.Description = ''
  taskDefinition.RegistrationInfo.Author = ''
  taskDefinition.Settings.StartWhenAvailable = false
  taskDefinition.Settings.Enabled  = true
  taskDefinition.Settings.Hidden = false



  unless trigger.empty?
    raise ArgumentError, 'Unknown trigger type' unless valid_trigger_option(trigger[:trigger_type])
    validate_trigger(trigger)

    startTime = "%04d-%02d-%02dT%02d:%02d:00" % [
      trigger[:start_year], trigger[:start_month], trigger[:start_day],
      trigger[:start_hour], trigger[:start_minute]
    ]

    # Set defaults
    trigger[:end_year]  ||= 0
    trigger[:end_month] ||= 0
    trigger[:end_day]   ||= 0

    endTime = "%04d-%02d-%02dT00:00:00" % [
      trigger[:end_year], trigger[:end_month], trigger[:end_day]
    ]

    trig = taskDefinition.Triggers.Create(trigger[:trigger_type].to_i)
    trig.Id = "RegistrationTriggerId#{taskDefinition.Triggers.Count}"
    trig.StartBoundary = startTime if startTime != '0000-00-00T00:00:00'
    trig.EndBoundary = endTime if endTime != '0000-00-00T00:00:00'
    trig.Enabled = true

    repetitionPattern = trig.Repetition

    if trigger[:minutes_duration].to_i > 0
      repetitionPattern.Duration = "PT#{trigger[:minutes_duration]||0}M"
    end

    if trigger[:minutes_interval].to_i > 0
      repetitionPattern.Interval = "PT#{trigger[:minutes_interval]||0}M"
    end

    tmp = trigger[:type]
    tmp = nil unless tmp.is_a?(Hash)

    case trigger[:trigger_type]
      when TASK_TIME_TRIGGER_DAILY
        trig.DaysInterval = tmp[:days_interval] if tmp && tmp[:days_interval]
        if trigger[:random_minutes_interval].to_i > 0
          trig.RandomDelay = "PT#{trigger[:random_minutes_interval]}M"
        end
      when TASK_TIME_TRIGGER_WEEKLY
        trig.DaysOfWeek = tmp[:days_of_week] if tmp && tmp[:days_of_week]
        trig.WeeksInterval = tmp[:weeks_interval] if tmp && tmp[:weeks_interval]
        if trigger[:random_minutes_interval].to_i > 0
          trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
        end
      when TASK_TIME_TRIGGER_MONTHLYDATE
        trig.MonthsOfYear = tmp[:months] if tmp && tmp[:months]
        trig.DaysOfMonth = tmp[:days] if tmp && tmp[:days]
        if trigger[:random_minutes_interval].to_i > 0
          trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
        end
        trig.RunOnLastDayOfMonth = trigger[:run_on_last_day_of_month] if trigger[:run_on_last_day_of_month]
      when TASK_TIME_TRIGGER_MONTHLYDOW
        trig.MonthsOfYear = tmp[:months] if tmp && tmp[:months]
        trig.DaysOfWeek = tmp[:days_of_week] if tmp && tmp[:days_of_week]
        trig.WeeksOfMonth = tmp[:weeks_of_month] if tmp && tmp[:weeks_of_month]
        if trigger[:random_minutes_interval].to_i>0
          trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
        end
        trig.RunOnLastWeekOfMonth = trigger[:run_on_last_week_of_month] if trigger[:run_on_last_week_of_month]
      when TASK_TIME_TRIGGER_ONCE
        if trigger[:random_minutes_interval].to_i > 0
          trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
        end
      when TASK_EVENT_TRIGGER_AT_SYSTEMSTART
        trig.Delay = "PT#{trigger[:delay_duration]||0}M"
      when TASK_EVENT_TRIGGER_AT_LOGON
        trig.UserId = trigger[:user_id] if trigger[:user_id]
        trig.Delay = "PT#{trigger[:delay_duration]||0}M"
    end
  end

  act = taskDefinition.Actions.Create(0)
  act.Path = 'cmd'

  @password = userinfo[:password]
  begin
    @task = @root.RegisterTaskDefinition(
      task,
      taskDefinition,
      TASK_CREATE_OR_UPDATE,
      userinfo[:user].nil? || userinfo[:user].empty? ? 'SYSTEM': userinfo[:user],
      userinfo[:password],
      userinfo[:password] ? TASK_LOGON_PASSWORD : TASK_LOGON_SERVICE_ACCOUNT
    )
  rescue WIN32OLERuntimeError => err
    raise Error, ole_error('RegisterTaskDefinition', err)
  end

  @task = @root.GetTask(task)
end

#next_run_timeObject

Returns a Time object that indicates the next time the task will run.



1042
1043
1044
1045
# File 'lib/win32/taskscheduler.rb', line 1042

def next_run_time
  check_for_active_task
  @task.NextRunTime
end

#parametersObject

Returns the command line parameters for the task.



403
404
405
406
407
408
409
410
411
412
413
# File 'lib/win32/taskscheduler.rb', line 403

def parameters
  check_for_active_task

  param = nil

  @task.Definition.Actions.each do |action|
    param = action.Arguments if action.Type == 0
  end

  param
end

#parameters=(param) ⇒ Object

Sets the parameters for the task. These parameters are passed as command line arguments to the application the task will run. To clear the command line parameters set it to an empty string. – NOTE: Again, it seems the task must be reactivated to be picked up.

Raises:

  • (TypeError)


421
422
423
424
425
426
427
428
429
430
431
432
433
434
# File 'lib/win32/taskscheduler.rb', line 421

def parameters=(param)
  raise TypeError unless param.is_a?(String)
  check_for_active_task

  definition = @task.Definition

  definition.Actions.each do |action|
    action.Arguments = param if action.Type == 0
  end

  update_task_definition(definition)

  param
end

#principalsObject

Returns a hash containing all the principal information of the current task



1276
1277
1278
1279
1280
1281
1282
1283
# File 'lib/win32/taskscheduler.rb', line 1276

def principals
  check_for_active_task
  principals_hash = {}
  @task.Definition.Principal.ole_get_methods.each do |principal|
    principals_hash[principal.name] = @task.Definition.Principal._getproperty(principal.dispid, [], [])
  end
  symbolize_keys(principals_hash)
end

#priorityObject

Returns the task’s priority level. Possible values are ‘idle’, ‘lowest’. ‘below_normal_8’, ‘below_normal_7’, ‘normal_6’, ‘normal_5’, ‘normal_4’, ‘above_normal_3’, ‘above_normal_2’, ‘highest’, ‘critical’ and ‘unknown’.



473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
# File 'lib/win32/taskscheduler.rb', line 473

def priority
  check_for_active_task

  case @task.Definition.Settings.Priority
    when 0
      priority = 'critical'
    when 1
      priority = 'highest'
    when 2
      priority = 'above_normal_2'
    when 3
      priority = 'above_normal_3'
    when 4
      priority = 'normal_4'
    when 5
      priority = 'normal_5'
    when 6
      priority = 'normal_6'
    when 7
      priority = 'below_normal_7'
    when 8
      priority = 'below_normal_8'
    when 9
      priority = 'lowest'
    when 10
      priority = 'idle'
    else
      priority = 'unknown'
  end

  priority
end

#priority=(priority) ⇒ Object

Sets the priority of the task. The priority should be a numeric priority constant value.

Raises:

  • (TypeError)


509
510
511
512
513
514
515
516
517
518
519
# File 'lib/win32/taskscheduler.rb', line 509

def priority=(priority)
  raise TypeError unless priority.is_a?(Numeric)
  check_for_active_task

  definition = @task.Definition
  definition.Settings.Priority = priority

  update_task_definition(definition)

  priority
end

#root_path(path = '\\') ⇒ Object



125
126
127
# File 'lib/win32/taskscheduler.rb', line 125

def root_path(path = '\\')
  path
end

#runObject

Execute the current task.



271
272
273
274
# File 'lib/win32/taskscheduler.rb', line 271

def run
  check_for_active_task
  @task.run(nil)
end

#save(file = nil) ⇒ Object

This method no longer has any effect. It is a no-op that remains for backwards compatibility. It will be removed in 0.4.0.



279
280
281
282
283
# File 'lib/win32/taskscheduler.rb', line 279

def save(file = nil)
  warn DeprecatedMethodWarning, "this method is no longer necessary"
  check_for_active_task
  # Do nothing, deprecated.
end

#set_account_information(user, password) ⇒ Object

Sets the user and password for the given task. If the user and password are set properly then true is returned. throws TypeError if password is not provided for other than system users

Raises:

  • (TypeError)


334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
# File 'lib/win32/taskscheduler.rb', line 334

def (user, password)
  raise TypeError unless user.is_a?(String)
  unless SYSTEM_USERS.include?(user.upcase)
    raise TypeError unless password.is_a?(String)
  end
  check_for_active_task

  @password = password

  begin
    @task = @root.RegisterTaskDefinition(
      @task.Path,
      @task.Definition,
      TASK_CREATE_OR_UPDATE,
      user,
      password,
      password ? TASK_LOGON_PASSWORD : TASK_LOGON_SERVICE_ACCOUNT
    )
  rescue WIN32OLERuntimeError => err
    raise Error, ole_error('RegisterTaskDefinition', err)
  end

  true
end

#set_machine(host, user = nil, domain = nil, password = nil) ⇒ Object Also known as: set_host

Similar to the TaskScheduler#machine= method, this method also allows you to pass a user, domain and password as needed. This method may require administrative privileges.

Raises:

  • (TypeError)


314
315
316
317
318
319
320
321
322
323
324
325
# File 'lib/win32/taskscheduler.rb', line 314

def set_machine(host, user = nil, domain = nil, password = nil)
  raise TypeError unless host.is_a?(String)

  begin
    @service.Connect(host, user, domain, password)
  rescue WIN32OLERuntimeError => err
    raise Error, ole_error('Connect', err)
  end

  @host = host
  host
end

#settingsObject

Returns a hash containing all settings of the current task



1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
# File 'lib/win32/taskscheduler.rb', line 1286

def settings
  check_for_active_task
  settings_hash = {}
  @task.Definition.Settings.ole_get_methods.each do |setting|
    next if setting.name == "XmlText" # not needed
    settings_hash[setting.name] = @task.Definition.Settings._getproperty(setting.dispid, [], [])
  end

  settings_hash["IdleSettings"] = idle_settings
  settings_hash["NetworkSettings"] = network_settings
  symbolize_keys(settings_hash)
end

#statusObject

Returns the status of the currently active task. Possible values are ‘ready’, ‘running’, ‘not scheduled’ or ‘unknown’.



960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
# File 'lib/win32/taskscheduler.rb', line 960

def status
  check_for_active_task

  case @task.State
    when 3
      status = 'ready'
    when 4
      status = 'running'
    when 2
      status = 'queued'
    when 1
      status = 'not scheduled'
    else
      status = 'unknown'
  end

  status
end

#task_user_id(definition) ⇒ Object



1319
1320
1321
# File 'lib/win32/taskscheduler.rb', line 1319

def task_user_id(definition)
  definition.Principal.UserId
end

#terminateObject Also known as: stop

Terminate (stop) the current task.



287
288
289
290
# File 'lib/win32/taskscheduler.rb', line 287

def terminate
  check_for_active_task
  @task.stop(nil)
end

#trigger(index) ⇒ Object

Returns a hash that describes the trigger at the given index for the current task.

Raises:

  • (TypeError)


690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
# File 'lib/win32/taskscheduler.rb', line 690

def trigger(index)
  raise TypeError unless index.is_a?(Numeric)
  check_for_active_task
  index += 1  # first item index is 1

  begin
    trig = @task.Definition.Triggers.Item(index)
  rescue WIN32OLERuntimeError => err
    raise Error, ole_error('Item', err)
  end

  trigger = {}

  case trig.Type
    when TASK_TIME_TRIGGER_DAILY
      tmp = {}
      tmp[:days_interval] = trig.DaysInterval
      trigger[:type] = tmp
      trigger[:random_minutes_interval] = time_in_minutes(trig.RandomDelay)
    when TASK_TIME_TRIGGER_WEEKLY
      tmp = {}
      tmp[:weeks_interval] = trig.WeeksInterval
      tmp[:days_of_week] = trig.DaysOfWeek
      trigger[:type] = tmp
      trigger[:random_minutes_interval] = time_in_minutes(trig.RandomDelay)
    when TASK_TIME_TRIGGER_MONTHLYDATE
      tmp = {}
      tmp[:months] = trig.MonthsOfYear
      tmp[:days] = trig.DaysOfMonth
      trigger[:type] = tmp
      trigger[:random_minutes_interval] = time_in_minutes(trig.RandomDelay)
      trigger[:run_on_last_day_of_month] = trig.RunOnLastDayOfMonth
    when TASK_TIME_TRIGGER_MONTHLYDOW
      tmp = {}
      tmp[:months] = trig.MonthsOfYear
      tmp[:days_of_week] = trig.DaysOfWeek
      tmp[:weeks_of_month] = trig.WeeksOfMonth
      trigger[:type] = tmp
      trigger[:random_minutes_interval] = time_in_minutes(trig.RandomDelay)
      trigger[:run_on_last_week_of_month] = trig.RunOnLastWeekOfMonth
    when TASK_TIME_TRIGGER_ONCE
      tmp = {}
      tmp[:once] = nil
      trigger[:type] = tmp
      trigger[:random_minutes_interval] = time_in_minutes(trig.RandomDelay)
    when TASK_EVENT_TRIGGER_AT_SYSTEMSTART
      trigger[:delay_duration] = time_in_minutes(trig.Delay)
    when TASK_EVENT_TRIGGER_AT_LOGON
      trigger[:user_id] = trig.UserId if trig.UserId.to_s != ""
      trigger[:delay_duration] = time_in_minutes(trig.Delay)
    when TASK_EVENT_TRIGGER_ON_IDLE
      trigger[:execution_time_limit] = time_in_minutes(trig.ExecutionTimeLimit)
    else
      raise Error, 'Unknown trigger type'
  end

  trigger[:start_year], trigger[:start_month], trigger[:start_day],
  trigger[:start_hour], trigger[:start_minute] = trig.StartBoundary.scan(/(\d+)-(\d+)-(\d+)T(\d+):(\d+)/).first

  trigger[:end_year], trigger[:end_month],
  trigger[:end_day] = trig.EndBoundary.scan(/(\d+)-(\d+)-(\d+)T/).first

  trigger[:minutes_duration] = time_in_minutes(trig.Repetition.Duration)
  trigger[:minutes_interval] = time_in_minutes(trig.Repetition.Interval)
  trigger[:trigger_type] = trig.Type

  trigger
end

#trigger=(trigger) ⇒ Object

Sets the trigger for the currently active task. The trigger is a hash with the following possible options:

  • days

  • days_interval

  • days_of_week

  • end_day

  • end_month

  • end_year

  • flags

  • minutes_duration

  • minutes_interval

  • months

  • random_minutes_interval

  • start_day

  • start_hour

  • start_minute

  • start_month

  • start_year

  • trigger_type

  • type

  • weeks

  • weeks_interval

Raises:

  • (TypeError)


783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
# File 'lib/win32/taskscheduler.rb', line 783

def trigger=(trigger)
  raise TypeError unless trigger.is_a?(Hash)
  raise ArgumentError, 'Unknown trigger type' unless valid_trigger_option(trigger[:trigger_type])

  check_for_active_task

  validate_trigger(trigger)

  definition = @task.Definition
  definition.Triggers.Clear()

  startTime = "%04d-%02d-%02dT%02d:%02d:00" % [
    trigger[:start_year], trigger[:start_month],
    trigger[:start_day], trigger[:start_hour], trigger[:start_minute]
  ]

  endTime = "%04d-%02d-%02dT00:00:00" % [
    trigger[:end_year], trigger[:end_month], trigger[:end_day]
  ]

  trig = definition.Triggers.Create( trigger[:trigger_type].to_i )
  trig.Id = "RegistrationTriggerId#{definition.Triggers.Count}"
  trig.StartBoundary = startTime if startTime != '0000-00-00T00:00:00'
  trig.EndBoundary = endTime if endTime != '0000-00-00T00:00:00'
  trig.Enabled = true

  repetitionPattern = trig.Repetition

  if trigger[:minutes_duration].to_i > 0
    repetitionPattern.Duration = "PT#{trigger[:minutes_duration]||0}M"
  end

  if trigger[:minutes_interval].to_i > 0
    repetitionPattern.Interval  = "PT#{trigger[:minutes_interval]||0}M"
  end

  tmp = trigger[:type]
  tmp = nil unless tmp.is_a?(Hash)

  case trigger[:trigger_type]
    when TASK_TIME_TRIGGER_DAILY
      trig.DaysInterval = tmp[:days_interval] if tmp && tmp[:days_interval]
      if trigger[:random_minutes_interval].to_i > 0
        trig.RandomDelay = "PT#{trigger[:random_minutes_interval]}M"
      end
    when TASK_TIME_TRIGGER_WEEKLY
      trig.DaysOfWeek = tmp[:days_of_week] if tmp && tmp[:days_of_week]
      trig.WeeksInterval = tmp[:weeks_interval] if tmp && tmp[:weeks_interval]
      if trigger[:random_minutes_interval].to_i > 0
        trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
      end
    when TASK_TIME_TRIGGER_MONTHLYDATE
      trig.MonthsOfYear = tmp[:months] if tmp && tmp[:months]
      trig.DaysOfMonth = tmp[:days] if tmp && tmp[:days]
      if trigger[:random_minutes_interval].to_i > 0
        trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
      end
      trig.RunOnLastDayOfMonth = trigger[:run_on_last_day_of_month] if trigger[:run_on_last_day_of_month]
    when TASK_TIME_TRIGGER_MONTHLYDOW
      trig.MonthsOfYear = tmp[:months] if tmp && tmp[:months]
      trig.DaysOfWeek = tmp[:days_of_week] if tmp && tmp[:days_of_week]
      trig.WeeksOfMonth = tmp[:weeks_of_month] if tmp && tmp[:weeks_of_month]
      if trigger[:random_minutes_interval].to_i > 0
        trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
      end
      trig.RunOnLastWeekOfMonth = trigger[:run_on_last_week_of_month] if trigger[:run_on_last_week_of_month]
    when TASK_TIME_TRIGGER_ONCE
      if trigger[:random_minutes_interval].to_i > 0
        trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
      end
    when TASK_EVENT_TRIGGER_AT_SYSTEMSTART
      trig.Delay = "PT#{trigger[:delay_duration]||0}M"
    when TASK_EVENT_TRIGGER_AT_LOGON
      trig.UserId = trigger[:user_id] if trigger[:user_id]
      trig.Delay = "PT#{trigger[:delay_duration]||0}M"
    when TASK_EVENT_TRIGGER_ON_IDLE
      # for setting execution time limit Ref : https://msdn.microsoft.com/en-us/library/windows/desktop/aa380724(v=vs.85).aspx
      if trigger[:execution_time_limit].to_i > 0
        trig.ExecutionTimeLimit = "PT#{trigger[:execution_time_limit]||0}M"
      end
  end

  update_task_definition(definition)

  trigger
end

#trigger_countObject

Returns the number of triggers associated with the active task.

Raises:



646
647
648
649
650
# File 'lib/win32/taskscheduler.rb', line 646

def trigger_count
  raise Error, "No currently active task" if @task.nil?

  @task.Definition.Triggers.Count
end

#trigger_string(index) ⇒ Object

Returns a string that describes the current trigger at the specified index for the active task.

Example: “At 7:14 AM every day, starting 4/11/2015”

Raises:

  • (TypeError)


657
658
659
660
661
662
663
664
665
666
667
668
669
# File 'lib/win32/taskscheduler.rb', line 657

def trigger_string(index)
  raise TypeError unless index.is_a?(Numeric)
  check_for_active_task
  index += 1  # first item index is 1

  begin
    trigger = @task.Definition.Triggers.Item(index)
  rescue WIN32OLERuntimeError
    raise Error, "No trigger found at index '#{index}'"
  end

  "Starting #{trigger.StartBoundary}"
end

#working_directoryObject

Returns the working directory for the task.



438
439
440
441
442
443
444
445
446
447
448
# File 'lib/win32/taskscheduler.rb', line 438

def working_directory
  check_for_active_task

  dir = nil

  @task.Definition.Actions.each do |action|
    dir = action.WorkingDirectory if action.Type == 0
  end

  dir
end

#working_directory=(dir) ⇒ Object

Sets the working directory for the task. – TODO: Why do I have to reactivate the task to see the change?

Raises:

  • (TypeError)


454
455
456
457
458
459
460
461
462
463
464
465
466
467
# File 'lib/win32/taskscheduler.rb', line 454

def working_directory=(dir)
  raise TypeError unless dir.is_a?(String)
  check_for_active_task

  definition = @task.Definition

  definition.Actions.each do |action|
    action.WorkingDirectory = dir if action.Type == 0
  end

  update_task_definition(definition)

  dir
end