win32-taskscheduler 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +122 -0
- data/Gemfile +3 -0
- data/README +2 -1
- data/RELEASE_NOTES.md +36 -0
- data/Rakefile +0 -1
- data/certs/djberg96_pub.pem +21 -21
- data/lib/win32/taskscheduler.rb +345 -404
- data/lib/win32/windows/constants.rb +260 -0
- data/lib/win32/windows/time_calc_helper.rb +130 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/win32/windows/time_calc_helper_spec.rb +392 -0
- data/win32-taskscheduler.gemspec +5 -4
- metadata +31 -29
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGES +0 -108
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08691b264f7dbe39c37043d65f3765f5949304c3'
|
4
|
+
data.tar.gz: 5247b4be4cf39cefcecb19c795e0dc158bf44ba1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9394becf37fc16d9fcff57728826f90388c94455f7fd082a5a86ccc87b04d319bf4835266d5119ff508daeed708abee096d49ee07e8ed69ea3e549830d8bf383
|
7
|
+
data.tar.gz: c59df6ee9dc73f263744e0464fdf1031277f66d85601b009995b913fcbb9cdcff10cc6fb41cf78b95ab8d2415b4483716c805b09438a4cd6ae567667355730c0
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
## [v0.4.0](https://github.com/chef/win32-taskscheduler/tree/win32-taskscheduler-0.4.0) (5-Apr-2018)
|
2
|
+
- Updated code to create task without trigger. [#25](https://github.com/chef/win32-taskscheduler/pull/25) ([#Vasu1105](https://github.com/Vasu1105))
|
3
|
+
- Fix for execution time limit and weeks of month. [#23](https://github.com/chef/win32-taskscheduler/pull/23) ([#Vasu1105](https://github.com/Vasu1105))
|
4
|
+
- Added methods to get and set principal information of the task. [#22](https://github.com/chef/win32-taskscheduler/pull/22) ([#Nimesh-Msys](https://github.com/Nimesh-Msys))
|
5
|
+
- Added methods to retrieve settings(all/Idle/Network) of current task. [#21](https://github.com/chef/win32-taskscheduler/pull/21) ([#Nimesh-Msys](https://github.com/Nimesh-Msys))
|
6
|
+
- Refactored constants, moved predefined MSDN constns to another file. [#20](https://github.com/chef/win32-taskscheduler/pull/20) ([#Nimesh-Msys](https://github.com/Nimesh-Msys))
|
7
|
+
- Added code to handle on idle trigger and on idle settings. [#19](https://github.com/chef/win32-taskscheduler/pull/19) ([#Vasu1105](https://github.com/Vasu1105))
|
8
|
+
- Fix for trigger at_logon and at_system_start. [#18](https://github.com/chef/win32-taskscheduler/pull/18) ([#Nimesh-Msys](https://github.com/Nimesh-Msys))
|
9
|
+
- Added get_task and enabled? method. [#17](https://github.com/chef/win32-taskscheduler/pull/17) ([#Vasu1105](https://github.com/Vasu1105))
|
10
|
+
- Fix for undefined method 'weeks' error while updating week_of_month[#16](https://github.com/chef/win32-taskscheduler/pull/16) ([#Vasu1105](https://github.com/Vasu1105))
|
11
|
+
- Fix for handling days of month for trigger_type MONTHLYDATE. [#15](https://github.com/chef/win32-taskscheduler/pull/15)([#Vasu1105](https://github.com/Vasu1105))
|
12
|
+
- Fix for setting system user for scheduled task. [#14](https://github.com/chef/win32-taskscheduler/pull/14) ([#Vasu1105](https://github.com/Vasu1105))
|
13
|
+
- Fix for Wrong value is set for end_day, end_year, end_month it should be EndBoundary and not StartBoundary. [#13](https://github.com/chef/win32-taskscheduler/pull/13)([#Vasu1105](https://github.com/Vasu1105))
|
14
|
+
|
15
|
+
## [v0.3.2](https://github.com/chef/win32-taskscheduler/tree/win32-taskscheduler-0.3.2) (18-Mar-2017)
|
16
|
+
- Use the block form for FFI::MemoryPointer in the error message helper
|
17
|
+
function. Thanks go to Ethan Brown for the suggestion.
|
18
|
+
- Fixed a potential bug in the helper module, which was also renamed to
|
19
|
+
help prevent any name collisions.
|
20
|
+
- Added the win32-taskscheduler.rb file for convenience.
|
21
|
+
- Added the configure_settings method.
|
22
|
+
- Added the configure_registration_info method.
|
23
|
+
- Added the description and description= aliases for comments.
|
24
|
+
- Added the author and author= aliases for creator.
|
25
|
+
- Some internal cleanup, moving common code to private methods.
|
26
|
+
- Rakefile now assumes Rubygems 2.0 or later for tasks.
|
27
|
+
- Gemspec cleanup, updated home page, removed old rubyforge_project reference.
|
28
|
+
- This gem is now signed.
|
29
|
+
|
30
|
+
## [v0.3.1](https://github.com/chef/win32-taskscheduler/tree/win32-taskscheduler-0.3.1) (6-Jul-2014)
|
31
|
+
- Added FFI as a dependency. Thanks go to Maxime Lapointe for the spot.
|
32
|
+
- Some updates to the win_error helper method. Thanks go to Ethan J. Brown
|
33
|
+
for the suggestions.
|
34
|
+
|
35
|
+
## [v0.3.0](https://github.com/chef/win32-taskscheduler/tree/win32-taskscheduler-0.3.0) (15-Jan-2014)
|
36
|
+
- Rewritten to use Win32OLE instead of using wrapping the C API. Benefits
|
37
|
+
include working on Windows Vista or later, and working with JRuby.
|
38
|
+
- Modified the constructor to accept 3rd and 4th arguments. These indicate
|
39
|
+
which folder to use, and whether or not to create it if it doesn't exist.
|
40
|
+
- The TaskScheduler#save method is now no longer necessary. It is retained
|
41
|
+
for backwards compatibility, but will raise a deprecation warning. In this
|
42
|
+
version simply calling TaskScheduler#activate will implement the task.
|
43
|
+
- Added support for the AT_SYSTEMSTART, AT_LOGON and ON_IDLE trigger types.
|
44
|
+
- Now requires the structured_warnings gem.
|
45
|
+
- Removed the doc directory and separate documentation file. Everything is
|
46
|
+
inlined now. There's still an example under the "examples" directory, too.
|
47
|
+
- Added test-unit, rake, and win32-security as development dependencies.
|
48
|
+
These are needed for testing only.
|
49
|
+
|
50
|
+
## [v0.2.2](https://github.com/chef/win32-taskscheduler/tree/win32-taskscheduler-0.2.2)(29-Feb-2012)
|
51
|
+
- Moved some include statements inside the TaskScheduler class to avoid
|
52
|
+
polluting Object. Thanks go to Josh Cooper for the spot and patch.
|
53
|
+
- Minor formatting tweaks to silence 1.9 warnings.
|
54
|
+
|
55
|
+
## [v0.2.1](https://github.com/chef/win32-taskscheduler/tree/win32-taskscheduler-0.2.1) (8-Oct-2011)
|
56
|
+
- Fixed a bug that would not allow task to run as SYSTEM. Thanks go to
|
57
|
+
Josh cooper for the spot and patch.
|
58
|
+
- Fixed a bug in new_work_item that would cause it to crash if you tried
|
59
|
+
to create a work item that already existed. An error is now raised instead.
|
60
|
+
Thanks go to Pete Higgins for the spot.
|
61
|
+
- The set_trigger and trigger= methods now internally transform and validate
|
62
|
+
the trigger hash in the same manner as new_work_item. Thanks again go to
|
63
|
+
Pete Higgins.
|
64
|
+
- Cleaned up the repo. The C source files have been removed from the main
|
65
|
+
repository (and this gem). They are in a separate branch on github for
|
66
|
+
anyone who misses them.
|
67
|
+
- Refactored the Rakefile, removing tasks related to the old C source files,
|
68
|
+
and added tasks for cleaning, building and installing a gem.
|
69
|
+
- Updated the README file, eliminating references to anything that was only
|
70
|
+
related to the older C version.
|
71
|
+
|
72
|
+
## [v0.2.0](https://github.com/chef/win32-taskscheduler/tree/win32-taskscheduler-0.2.0)(19-Jun-2009)
|
73
|
+
- Rewritten in pure Ruby!
|
74
|
+
- The TaskScheduler::ONCE constant is now a valid trigger type. Thanks go to
|
75
|
+
Uri Iurgel for the spot and patch.
|
76
|
+
- Added the TaskScheduler#exists? method.
|
77
|
+
- Added the TaskScheduler#tasks alias for the TaskScheduler#enum method.
|
78
|
+
- The TaskScheduler#new_work_item method now accepts symbols as well as
|
79
|
+
strings for hash keys, and ignores case. Also, the keys are now validated.
|
80
|
+
- Renamed the example file and test file.
|
81
|
+
- Added the 'example' Rake task.
|
82
|
+
- Fixed some code in the README synopsis that was incorrect.
|
83
|
+
|
84
|
+
## [v0.1.0](11-May-2008)
|
85
|
+
- The TaskScheduler#save instance method now accepts an optional file name.
|
86
|
+
- Most of the TaskScheduler setter methods now return the value specified
|
87
|
+
instead of true.
|
88
|
+
- Removed the RUN_ONLY_IF_DOCKED and RUN_IF_CONNECTED_TO_INTERNET constants.
|
89
|
+
The MSDN docs say that they are unused.
|
90
|
+
- Added more documentation. Much more rdoc friendly now.
|
91
|
+
- Added many more tests.
|
92
|
+
- Better type handling for bad arguments.
|
93
|
+
- Added a Rakefile with tasks for building, installation and testing.
|
94
|
+
- Added a gemspec.
|
95
|
+
- Inlined the rdoc documentation.
|
96
|
+
- Internal project reorganization and code cleanup.
|
97
|
+
|
98
|
+
## [v0.0.3](1-Mar-2005)
|
99
|
+
- Bug fix for the bitFieldToHumanDays() internal function.
|
100
|
+
- Moved the 'examples' directory to the toplevel directory.
|
101
|
+
- Made the CHANGES and README files rdoc friendly.
|
102
|
+
- Minor updates to taskscheduler.h.
|
103
|
+
|
104
|
+
## [v0.0.2](04-Aug-2004)
|
105
|
+
- Now uses the newer allocation framework and replaced all instances of the
|
106
|
+
deprecated STR2CSTR() function with StringValuePtr(). This means that, as
|
107
|
+
of this release, Ruby 1.8.0 or later is required.
|
108
|
+
- Modified the constructor to accept arguments. This is just some sugar for
|
109
|
+
creating a new task item in one call instead of two.
|
110
|
+
- The argument to trigger= now must be a hash. The same goes for the 'type'
|
111
|
+
sub-hash.
|
112
|
+
- Added the add_trigger() method. Actually, the C code for this method was
|
113
|
+
already in place, I simply forgot to create a corresponding Ruby method
|
114
|
+
for it.
|
115
|
+
- Removed the create_trigger() method. This was really nothing more than an
|
116
|
+
alias for trigger=(). I got confused somehow.
|
117
|
+
- Test suite modified and many more tests added.
|
118
|
+
- Documentation updates, including docs for a couple of methods that I had
|
119
|
+
accidentally omitted previously.
|
120
|
+
|
121
|
+
## [v0.0.1](24-Apr-2004)
|
122
|
+
- Initial release
|
data/Gemfile
ADDED
data/README
CHANGED
@@ -58,10 +58,11 @@
|
|
58
58
|
|
59
59
|
Please submit any bug reports to the project page at:
|
60
60
|
|
61
|
-
http://github.com/
|
61
|
+
http://github.com/chef/win32-taskscheduler
|
62
62
|
|
63
63
|
= Copyright
|
64
64
|
(C) 2003-2017 Daniel J. Berger
|
65
|
+
(C) 2018 Chef Software, Inc.
|
65
66
|
All Rights Reserved
|
66
67
|
|
67
68
|
= License
|
data/RELEASE_NOTES.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
<!---
|
2
|
+
This file is reset every time a new release is done. The contents of this file are for the currently unreleased version.
|
3
|
+
|
4
|
+
Example Note:
|
5
|
+
|
6
|
+
## Example Heading
|
7
|
+
Details about the thing that changed that needs to get included in the Release Notes in markdown.
|
8
|
+
-->
|
9
|
+
|
10
|
+
# win32-taskscheduler 0.4.0 release notes:
|
11
|
+
In this release we have fixed some issues and added following methods.
|
12
|
+
|
13
|
+
`get_task`
|
14
|
+
Returns current active task with given name.
|
15
|
+
|
16
|
+
`configure_principals`
|
17
|
+
Sets the principals for current active task. The principal is hash with following possible options.
|
18
|
+
Expected principal hash: { id: STRING, display_name: STRING, user_id: STRING, logon_type: INTEGER, group_id: STRING, run_level: INTEGER }
|
19
|
+
|
20
|
+
'principals'
|
21
|
+
Returns a hash containing all the principal information of the current task.
|
22
|
+
|
23
|
+
`execution_time_limit`
|
24
|
+
Returns execution time limit for current active task.
|
25
|
+
|
26
|
+
`settings`
|
27
|
+
Returns a hash containing all settings of the current task.
|
28
|
+
|
29
|
+
`idle_settings`
|
30
|
+
Returns a hash of idle settings of the current task.
|
31
|
+
|
32
|
+
`network_settings`
|
33
|
+
Returns a hash of network settings of the current task.
|
34
|
+
|
35
|
+
'enabled?'
|
36
|
+
Returns true if current task is enabled
|
data/Rakefile
CHANGED
data/certs/djberg96_pub.pem
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
2
|
-
MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MREwDwYDVQQDDAhkamJl
|
3
|
-
cmc5NjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
|
4
|
-
MB4XDTE2MTIxMjAwMTQ1M1oXDTE3MTIxMjAwMTQ1M1owPzERMA8GA1UEAwwIZGpi
|
5
|
-
ZXJnOTYxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
|
6
|
-
bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVtTm/wETO8yKVKRPBO
|
7
|
-
VgPRvE94iEfKryOb/tQrmhGhchG2ALqdw/r54cGJvLaXeItrYJ6N8pSE/FSnN5jM
|
8
|
-
xugUhHBprPl+AsQ4E+IBy0dKwyU8XjFoVYzWvT1wnqwQdSazdgFCfQqb51QCgUIT
|
9
|
-
PGGakKlyzCb3Mbq30is8+QlRrqXt/JbpkUZbQwUqCdAulMT4oyPBk/L+48pbVX0s
|
10
|
-
4yj7YaVAqfGByAMTPXEmUS388lX+0xq8+GGir2Fuh0TpNW0ggr9BxprwqL0Mg4Oo
|
11
|
-
YhM5L1y8Plolo8mOTN3+K8I3afZ0lD0BtwniVb6g+Ut/4aBjKy2+GyFwwNOu0gSj
|
12
|
-
desCAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFJfg
|
13
|
-
HmQ0uDU3Z9A9hB1lQMjr5VZSMB0GA1UdEQQWMBSBEmRqYmVyZzk2QGdtYWlsLmNv
|
14
|
-
bTAdBgNVHRIEFjAUgRJkamJlcmc5NkBnbWFpbC5jb20wDQYJKoZIhvcNAQEFBQAD
|
15
|
-
ggEBACjRCHRP944MHIQJNCglZbDnZowybV2HxmG1uhnvRwrOjBA7CXemc+QSAL7K
|
16
|
-
7eXC4FdojVEJrnU7ZxuCmfQU+fvkEQKOnah1osG1874aPiDlwtjHclpeqcDgTUI7
|
17
|
-
A7CF+OXK8x7ksFx205ruhPHKaPYtwVG/W/J+y7Wx8yl9rvwUgRBL5cVzTBiEz+AB
|
18
|
-
NRT7yoHXXfFXjuQWN1eHunSbNds2ZTGQd64yBCujb17Xdl+F9tu4klkTga3gxP3P
|
19
|
-
y3zoX1VttxnIZBojRM/s2A7c2aubMH2SVbXMR3ccVkB9XbYKl1OvCe7q85xEHit2
|
20
|
-
Kbpico5nnyHqf7YSPmvZe8bCU94=
|
21
|
-
-----END CERTIFICATE-----
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MREwDwYDVQQDDAhkamJl
|
3
|
+
cmc5NjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
|
4
|
+
MB4XDTE2MTIxMjAwMTQ1M1oXDTE3MTIxMjAwMTQ1M1owPzERMA8GA1UEAwwIZGpi
|
5
|
+
ZXJnOTYxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
|
6
|
+
bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVtTm/wETO8yKVKRPBO
|
7
|
+
VgPRvE94iEfKryOb/tQrmhGhchG2ALqdw/r54cGJvLaXeItrYJ6N8pSE/FSnN5jM
|
8
|
+
xugUhHBprPl+AsQ4E+IBy0dKwyU8XjFoVYzWvT1wnqwQdSazdgFCfQqb51QCgUIT
|
9
|
+
PGGakKlyzCb3Mbq30is8+QlRrqXt/JbpkUZbQwUqCdAulMT4oyPBk/L+48pbVX0s
|
10
|
+
4yj7YaVAqfGByAMTPXEmUS388lX+0xq8+GGir2Fuh0TpNW0ggr9BxprwqL0Mg4Oo
|
11
|
+
YhM5L1y8Plolo8mOTN3+K8I3afZ0lD0BtwniVb6g+Ut/4aBjKy2+GyFwwNOu0gSj
|
12
|
+
desCAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFJfg
|
13
|
+
HmQ0uDU3Z9A9hB1lQMjr5VZSMB0GA1UdEQQWMBSBEmRqYmVyZzk2QGdtYWlsLmNv
|
14
|
+
bTAdBgNVHRIEFjAUgRJkamJlcmc5NkBnbWFpbC5jb20wDQYJKoZIhvcNAQEFBQAD
|
15
|
+
ggEBACjRCHRP944MHIQJNCglZbDnZowybV2HxmG1uhnvRwrOjBA7CXemc+QSAL7K
|
16
|
+
7eXC4FdojVEJrnU7ZxuCmfQU+fvkEQKOnah1osG1874aPiDlwtjHclpeqcDgTUI7
|
17
|
+
A7CF+OXK8x7ksFx205ruhPHKaPYtwVG/W/J+y7Wx8yl9rvwUgRBL5cVzTBiEz+AB
|
18
|
+
NRT7yoHXXfFXjuQWN1eHunSbNds2ZTGQd64yBCujb17Xdl+F9tu4klkTga3gxP3P
|
19
|
+
y3zoX1VttxnIZBojRM/s2A7c2aubMH2SVbXMR3ccVkB9XbYKl1OvCe7q85xEHit2
|
20
|
+
Kbpico5nnyHqf7YSPmvZe8bCU94=
|
21
|
+
-----END CERTIFICATE-----
|
data/lib/win32/taskscheduler.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require_relative 'windows/helper'
|
2
|
+
require_relative 'windows/time_calc_helper'
|
3
|
+
require_relative 'windows/constants'
|
2
4
|
require 'win32ole'
|
3
5
|
require 'socket'
|
4
6
|
require 'time'
|
@@ -10,215 +12,111 @@ module Win32
|
|
10
12
|
# The TaskScheduler class encapsulates a Windows scheduled task
|
11
13
|
class TaskScheduler
|
12
14
|
include Windows::TaskSchedulerHelper
|
15
|
+
include Windows::TimeCalcHelper
|
16
|
+
include Windows::TaskSchedulerConstants
|
13
17
|
|
14
18
|
# The version of the win32-taskscheduler library
|
15
|
-
VERSION = '0.
|
19
|
+
VERSION = '0.4.0'.freeze
|
16
20
|
|
17
21
|
# The Error class is typically raised if any TaskScheduler methods fail.
|
18
22
|
class Error < StandardError; end
|
19
23
|
|
20
|
-
#
|
21
|
-
|
22
|
-
# Trigger is set to run the task a single tim
|
23
|
-
TASK_TIME_TRIGGER_ONCE = 0
|
24
|
-
|
25
|
-
# Trigger is set to run the task on a daily interval
|
26
|
-
TASK_TIME_TRIGGER_DAILY = 1
|
27
|
-
|
28
|
-
# Trigger is set to run the task on specific days of a specific week & month
|
29
|
-
TASK_TIME_TRIGGER_WEEKLY = 2
|
30
|
-
|
31
|
-
# Trigger is set to run the task on specific day(s) of the month
|
32
|
-
TASK_TIME_TRIGGER_MONTHLYDATE = 3
|
33
|
-
|
34
|
-
# Trigger is set to run the task on specific day(s) of the month
|
35
|
-
TASK_TIME_TRIGGER_MONTHLYDOW = 4
|
36
|
-
|
37
|
-
# Trigger is set to run the task if the system remains idle for the amount
|
38
|
-
# of time specified by the idle wait time of the task
|
39
|
-
TASK_EVENT_TRIGGER_ON_IDLE = 5
|
40
|
-
|
41
|
-
# Trigger is set to run the task at system startup
|
42
|
-
TASK_EVENT_TRIGGER_AT_SYSTEMSTART = 6
|
43
|
-
|
44
|
-
# Trigger is set to run the task when a user logs on
|
45
|
-
TASK_EVENT_TRIGGER_AT_LOGON = 7
|
46
|
-
|
47
|
-
# Daily Tasks
|
48
|
-
|
49
|
-
# The task will run on Sunday
|
50
|
-
TASK_SUNDAY = 0x1
|
51
|
-
|
52
|
-
# The task will run on Monday
|
53
|
-
TASK_MONDAY = 0x2
|
54
|
-
|
55
|
-
# The task will run on Tuesday
|
56
|
-
TASK_TUESDAY = 0x4
|
57
|
-
|
58
|
-
# The task will run on Wednesday
|
59
|
-
TASK_WEDNESDAY = 0x8
|
60
|
-
|
61
|
-
# The task will run on Thursday
|
62
|
-
TASK_THURSDAY = 0x10
|
63
|
-
|
64
|
-
# The task will run on Friday
|
65
|
-
TASK_FRIDAY = 0x20
|
66
|
-
|
67
|
-
# The task will run on Saturday
|
68
|
-
TASK_SATURDAY = 0x40
|
69
|
-
|
70
|
-
# Weekly tasks
|
71
|
-
|
72
|
-
# The task will run between the 1st and 7th day of the month
|
73
|
-
TASK_FIRST_WEEK = 1
|
74
|
-
|
75
|
-
# The task will run between the 8th and 14th day of the month
|
76
|
-
TASK_SECOND_WEEK = 2
|
77
|
-
|
78
|
-
# The task will run between the 15th and 21st day of the month
|
79
|
-
TASK_THIRD_WEEK = 3
|
80
|
-
|
81
|
-
# The task will run between the 22nd and 28th day of the month
|
82
|
-
TASK_FOURTH_WEEK = 4
|
83
|
-
|
84
|
-
# The task will run the last seven days of the month
|
85
|
-
TASK_LAST_WEEK = 5
|
86
|
-
|
87
|
-
# Monthly tasks
|
88
|
-
|
89
|
-
# The task will run in January
|
90
|
-
TASK_JANUARY = 0x1
|
91
|
-
|
92
|
-
# The task will run in February
|
93
|
-
TASK_FEBRUARY = 0x2
|
94
|
-
|
95
|
-
# The task will run in March
|
96
|
-
TASK_MARCH = 0x4
|
97
|
-
|
98
|
-
# The task will run in April
|
99
|
-
TASK_APRIL = 0x8
|
100
|
-
|
101
|
-
# The task will run in May
|
102
|
-
TASK_MAY = 0x10
|
103
|
-
|
104
|
-
# The task will run in June
|
105
|
-
TASK_JUNE = 0x20
|
106
|
-
|
107
|
-
# The task will run in July
|
108
|
-
TASK_JULY = 0x40
|
109
|
-
|
110
|
-
# The task will run in August
|
111
|
-
TASK_AUGUST = 0x80
|
112
|
-
|
113
|
-
# The task will run in September
|
114
|
-
TASK_SEPTEMBER = 0x100
|
115
|
-
|
116
|
-
# The task will run in October
|
117
|
-
TASK_OCTOBER = 0x200
|
118
|
-
|
119
|
-
# The task will run in November
|
120
|
-
TASK_NOVEMBER = 0x400
|
121
|
-
|
122
|
-
# The task will run in December
|
123
|
-
TASK_DECEMBER = 0x800
|
124
|
-
|
125
|
-
# Flags
|
126
|
-
|
127
|
-
# Used when converting AT service jobs into work items
|
128
|
-
TASK_FLAG_INTERACTIVE = 0x1
|
129
|
-
|
130
|
-
# The work item will be deleted when there are no more scheduled run times
|
131
|
-
TASK_FLAG_DELETE_WHEN_DONE = 0x2
|
132
|
-
|
133
|
-
# The work item is disabled. Useful for temporarily disabling a task
|
134
|
-
TASK_FLAG_DISABLED = 0x4
|
135
|
-
|
136
|
-
# The work item begins only if the computer is not in use at the scheduled
|
137
|
-
# start time
|
138
|
-
TASK_FLAG_START_ONLY_IF_IDLE = 0x10
|
139
|
-
|
140
|
-
# The work item terminates if the computer makes an idle to non-idle
|
141
|
-
# transition while the work item is running
|
142
|
-
TASK_FLAG_KILL_ON_IDLE_END = 0x20
|
143
|
-
|
144
|
-
# The work item does not start if the computer is running on battery power
|
145
|
-
TASK_FLAG_DONT_START_IF_ON_BATTERIES = 0x40
|
146
|
-
|
147
|
-
# The work item ends, and the associated application quits, if the computer
|
148
|
-
# switches to battery power
|
149
|
-
TASK_FLAG_KILL_IF_GOING_ON_BATTERIES = 0x80
|
150
|
-
|
151
|
-
# The work item starts only if the computer is in a docking station
|
152
|
-
TASK_FLAG_RUN_ONLY_IF_DOCKED = 0x100
|
153
|
-
|
154
|
-
# The work item created will be hidden
|
155
|
-
TASK_FLAG_HIDDEN = 0x200
|
156
|
-
|
157
|
-
# The work item runs only if there is a valid internet connection
|
158
|
-
TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET = 0x400
|
159
|
-
|
160
|
-
# The work item starts again if the computer makes a non-idle to idle
|
161
|
-
# transition
|
162
|
-
TASK_FLAG_RESTART_ON_IDLE_RESUME = 0x800
|
163
|
-
|
164
|
-
# The work item causes the system to be resumed, or awakened, if the
|
165
|
-
# system is running on batter power
|
166
|
-
TASK_FLAG_SYSTEM_REQUIRED = 0x1000
|
167
|
-
|
168
|
-
# The work item runs only if a specified account is logged on interactively
|
169
|
-
TASK_FLAG_RUN_ONLY_IF_LOGGED_ON = 0x2000
|
170
|
-
|
171
|
-
# Triggers
|
172
|
-
|
173
|
-
# The task will stop at some point in time
|
174
|
-
TASK_TRIGGER_FLAG_HAS_END_DATE = 0x1
|
175
|
-
|
176
|
-
# The task can be stopped at the end of the repetition period
|
177
|
-
TASK_TRIGGER_FLAG_KILL_AT_DURATION_END = 0x2
|
178
|
-
|
179
|
-
# The task trigger is disabled
|
180
|
-
TASK_TRIGGER_FLAG_DISABLED = 0x4
|
181
|
-
|
182
|
-
# :stopdoc:
|
24
|
+
# Shorthand constants
|
183
25
|
|
184
|
-
|
185
|
-
|
26
|
+
IDLE = IDLE_PRIORITY_CLASS
|
27
|
+
NORMAL = NORMAL_PRIORITY_CLASS
|
28
|
+
HIGH = HIGH_PRIORITY_CLASS
|
29
|
+
REALTIME = REALTIME_PRIORITY_CLASS
|
30
|
+
BELOW_NORMAL = BELOW_NORMAL_PRIORITY_CLASS
|
31
|
+
ABOVE_NORMAL = ABOVE_NORMAL_PRIORITY_CLASS
|
186
32
|
|
187
|
-
|
33
|
+
ONCE = TASK_TIME_TRIGGER_ONCE
|
34
|
+
DAILY = TASK_TIME_TRIGGER_DAILY
|
35
|
+
WEEKLY = TASK_TIME_TRIGGER_WEEKLY
|
36
|
+
MONTHLYDATE = TASK_TIME_TRIGGER_MONTHLYDATE
|
37
|
+
MONTHLYDOW = TASK_TIME_TRIGGER_MONTHLYDOW
|
188
38
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
39
|
+
ON_IDLE = TASK_EVENT_TRIGGER_ON_IDLE
|
40
|
+
AT_SYSTEMSTART = TASK_EVENT_TRIGGER_AT_SYSTEMSTART
|
41
|
+
AT_LOGON = TASK_EVENT_TRIGGER_AT_LOGON
|
42
|
+
FIRST_WEEK = TASK_FIRST_WEEK
|
43
|
+
SECOND_WEEK = TASK_SECOND_WEEK
|
44
|
+
THIRD_WEEK = TASK_THIRD_WEEK
|
45
|
+
FOURTH_WEEK = TASK_FOURTH_WEEK
|
46
|
+
LAST_WEEK = TASK_LAST_WEEK
|
47
|
+
SUNDAY = TASK_SUNDAY
|
48
|
+
MONDAY = TASK_MONDAY
|
49
|
+
TUESDAY = TASK_TUESDAY
|
50
|
+
WEDNESDAY = TASK_WEDNESDAY
|
51
|
+
THURSDAY = TASK_THURSDAY
|
52
|
+
FRIDAY = TASK_FRIDAY
|
53
|
+
SATURDAY = TASK_SATURDAY
|
54
|
+
JANUARY = TASK_JANUARY
|
55
|
+
FEBRUARY = TASK_FEBRUARY
|
56
|
+
MARCH = TASK_MARCH
|
57
|
+
APRIL = TASK_APRIL
|
58
|
+
MAY = TASK_MAY
|
59
|
+
JUNE = TASK_JUNE
|
60
|
+
JULY = TASK_JULY
|
61
|
+
AUGUST = TASK_AUGUST
|
62
|
+
SEPTEMBER = TASK_SEPTEMBER
|
63
|
+
OCTOBER = TASK_OCTOBER
|
64
|
+
NOVEMBER = TASK_NOVEMBER
|
65
|
+
DECEMBER = TASK_DECEMBER
|
196
66
|
|
197
|
-
|
67
|
+
INTERACTIVE = TASK_FLAG_INTERACTIVE
|
68
|
+
DELETE_WHEN_DONE = TASK_FLAG_DELETE_WHEN_DONE
|
69
|
+
DISABLED = TASK_FLAG_DISABLED
|
70
|
+
START_ONLY_IF_IDLE = TASK_FLAG_START_ONLY_IF_IDLE
|
71
|
+
KILL_ON_IDLE_END = TASK_FLAG_KILL_ON_IDLE_END
|
72
|
+
DONT_START_IF_ON_BATTERIES = TASK_FLAG_DONT_START_IF_ON_BATTERIES
|
73
|
+
KILL_IF_GOING_ON_BATTERIES = TASK_FLAG_KILL_IF_GOING_ON_BATTERIES
|
74
|
+
RUN_ONLY_IF_DOCKED = TASK_FLAG_RUN_ONLY_IF_DOCKED
|
75
|
+
HIDDEN = TASK_FLAG_HIDDEN
|
76
|
+
RUN_IF_CONNECTED_TO_INTERNET = TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET
|
77
|
+
RESTART_ON_IDLE_RESUME = TASK_FLAG_RESTART_ON_IDLE_RESUME
|
78
|
+
SYSTEM_REQUIRED = TASK_FLAG_SYSTEM_REQUIRED
|
79
|
+
RUN_ONLY_IF_LOGGED_ON = TASK_FLAG_RUN_ONLY_IF_LOGGED_ON
|
198
80
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
TASK_LOGON_INTERACTIVE_TOKEN = 3
|
203
|
-
TASK_LOGON_GROUP = 4
|
204
|
-
TASK_LOGON_SERVICE_ACCOUNT = 5
|
205
|
-
TASK_LOGON_INTERACTIVE_TOKEN_OR_PASSWORD = 6
|
81
|
+
FLAG_HAS_END_DATE = TASK_TRIGGER_FLAG_HAS_END_DATE
|
82
|
+
FLAG_KILL_AT_DURATION_END = TASK_TRIGGER_FLAG_KILL_AT_DURATION_END
|
83
|
+
FLAG_DISABLED = TASK_TRIGGER_FLAG_DISABLED
|
206
84
|
|
207
|
-
|
85
|
+
MAX_RUN_TIMES = TASK_MAX_RUN_TIMES
|
208
86
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
87
|
+
FIRST = TASK_FIRST
|
88
|
+
SECOND = TASK_SECOND
|
89
|
+
THIRD = TASK_THIRD
|
90
|
+
FOURTH = TASK_FOURTH
|
91
|
+
FIFTH = TASK_FIFTH
|
92
|
+
SIXTH = TASK_SIXTH
|
93
|
+
SEVENTH = TASK_SEVENTH
|
94
|
+
EIGHTH = TASK_EIGHTH
|
95
|
+
NINETH = TASK_NINETH
|
96
|
+
TENTH = TASK_TENTH
|
97
|
+
ELEVENTH = TASK_ELEVENTH
|
98
|
+
TWELFTH = TASK_TWELFTH
|
99
|
+
THIRTEENTH = TASK_THIRTEENTH
|
100
|
+
FOURTEENTH = TASK_FOURTEENTH
|
101
|
+
FIFTEENTH = TASK_FIFTEENTH
|
102
|
+
SIXTEENTH = TASK_SIXTEENTH
|
103
|
+
SEVENTEENTH = TASK_SEVENTEENTH
|
104
|
+
EIGHTEENTH = TASK_EIGHTEENTH
|
105
|
+
NINETEENTH = TASK_NINETEENTH
|
106
|
+
TWENTIETH = TASK_TWENTIETH
|
107
|
+
TWENTY_FIRST = TASK_TWENTY_FIRST
|
108
|
+
TWENTY_SECOND = TASK_TWENTY_SECOND
|
109
|
+
TWENTY_THIRD = TASK_TWENTY_THIRD
|
110
|
+
TWENTY_FOURTH = TASK_TWENTY_FOURTH
|
111
|
+
TWENTY_FIFTH = TASK_TWENTY_FIFTH
|
112
|
+
TWENTY_SIXTH = TASK_TWENTY_SIXTH
|
113
|
+
TWENTY_SEVENTH = TASK_TWENTY_SEVENTH
|
114
|
+
TWENTY_EIGHTH = TASK_TWENTY_EIGHTH
|
115
|
+
TWENTY_NINTH = TASK_TWENTY_NINTH
|
116
|
+
THIRTYETH = TASK_THIRTYETH
|
117
|
+
THIRTY_FIRST = TASK_THIRTY_FIRST
|
118
|
+
LAST = TASK_LAST
|
215
119
|
|
216
|
-
CLSCTX_INPROC_SERVER = 0x1
|
217
|
-
CLSID_CTask = [0x148BD520,0xA2AB,0x11CE,0xB1,0x1F,0x00,0xAA,0x00,0x53,0x05,0x03].pack('LSSC8')
|
218
|
-
CLSID_CTaskScheduler = [0x148BD52A,0xA2AB,0x11CE,0xB1,0x1F,0x00,0xAA,0x00,0x53,0x05,0x03].pack('LSSC8')
|
219
|
-
IID_ITaskScheduler = [0x148BD527,0xA2AB,0x11CE,0xB1,0x1F,0x00,0xAA,0x00,0x53,0x05,0x03].pack('LSSC8')
|
220
|
-
IID_ITask = [0x148BD524,0xA2AB,0x11CE,0xB1,0x1F,0x00,0xAA,0x00,0x53,0x05,0x03].pack('LSSC8')
|
221
|
-
IID_IPersistFile = [0x0000010b,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46].pack('LSSC8')
|
222
120
|
|
223
121
|
# :startdoc:
|
224
122
|
|
@@ -298,6 +196,19 @@ module Win32
|
|
298
196
|
enum.include?(task)
|
299
197
|
end
|
300
198
|
|
199
|
+
# Return the sepcified task if exist
|
200
|
+
#
|
201
|
+
def get_task(task)
|
202
|
+
raise TypeError unless task.is_a?(String)
|
203
|
+
|
204
|
+
begin
|
205
|
+
registeredTask = @root.GetTask(task)
|
206
|
+
@task = registeredTask
|
207
|
+
rescue WIN32OLERuntimeError => err
|
208
|
+
raise Error, ole_error('activate', err)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
301
212
|
# Activate the specified task.
|
302
213
|
#
|
303
214
|
def activate(task)
|
@@ -388,10 +299,12 @@ module Win32
|
|
388
299
|
|
389
300
|
# Sets the +user+ and +password+ for the given task. If the user and
|
390
301
|
# password are set properly then true is returned.
|
391
|
-
#
|
302
|
+
# throws TypeError if password is not provided for other than system users
|
392
303
|
def set_account_information(user, password)
|
393
304
|
raise TypeError unless user.is_a?(String)
|
394
|
-
|
305
|
+
unless SYSTEM_USERS.include?(user.upcase)
|
306
|
+
raise TypeError unless password.is_a?(String)
|
307
|
+
end
|
395
308
|
check_for_active_task
|
396
309
|
|
397
310
|
@password = password
|
@@ -582,8 +495,6 @@ module Win32
|
|
582
495
|
raise TypeError unless task.is_a?(String)
|
583
496
|
raise TypeError unless trigger.is_a?(Hash)
|
584
497
|
|
585
|
-
validate_trigger(trigger)
|
586
|
-
|
587
498
|
taskDefinition = @service.NewTask(0)
|
588
499
|
taskDefinition.RegistrationInfo.Description = ''
|
589
500
|
taskDefinition.RegistrationInfo.Author = ''
|
@@ -591,95 +502,85 @@ module Win32
|
|
591
502
|
taskDefinition.Settings.Enabled = true
|
592
503
|
taskDefinition.Settings.Hidden = false
|
593
504
|
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
when TASK_TIME_TRIGGER_DAILY
|
598
|
-
type = 2
|
599
|
-
when TASK_TIME_TRIGGER_WEEKLY
|
600
|
-
type = 3
|
601
|
-
when TASK_TIME_TRIGGER_MONTHLYDATE
|
602
|
-
type = 4
|
603
|
-
when TASK_TIME_TRIGGER_MONTHLYDOW
|
604
|
-
type = 5
|
605
|
-
when TASK_EVENT_TRIGGER_ON_IDLE
|
606
|
-
type = 6
|
607
|
-
when TASK_EVENT_TRIGGER_AT_SYSTEMSTART
|
608
|
-
type = 8
|
609
|
-
when TASK_EVENT_TRIGGER_AT_LOGON
|
610
|
-
type = 9
|
611
|
-
else
|
612
|
-
raise ArgumentError, 'Unknown trigger type'
|
613
|
-
end
|
505
|
+
unless trigger.empty?
|
506
|
+
raise ArgumentError, 'Unknown trigger type' unless valid_trigger_option(trigger[:trigger_type])
|
507
|
+
validate_trigger(trigger)
|
614
508
|
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
# Set defaults
|
621
|
-
trigger[:end_year] ||= 0
|
622
|
-
trigger[:end_month] ||= 0
|
623
|
-
trigger[:end_day] ||= 0
|
509
|
+
startTime = "%04d-%02d-%02dT%02d:%02d:00" % [
|
510
|
+
trigger[:start_year], trigger[:start_month], trigger[:start_day],
|
511
|
+
trigger[:start_hour], trigger[:start_minute]
|
512
|
+
]
|
624
513
|
|
625
|
-
|
626
|
-
trigger[:end_year]
|
627
|
-
|
514
|
+
# Set defaults
|
515
|
+
trigger[:end_year] ||= 0
|
516
|
+
trigger[:end_month] ||= 0
|
517
|
+
trigger[:end_day] ||= 0
|
628
518
|
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
trig.EndBoundary = endTime if endTime != '0000-00-00T00:00:00'
|
633
|
-
trig.Enabled = true
|
519
|
+
endTime = "%04d-%02d-%02dT00:00:00" % [
|
520
|
+
trigger[:end_year], trigger[:end_month], trigger[:end_day]
|
521
|
+
]
|
634
522
|
|
635
|
-
|
523
|
+
trig = taskDefinition.Triggers.Create(trigger[:trigger_type].to_i)
|
524
|
+
trig.Id = "RegistrationTriggerId#{taskDefinition.Triggers.Count}"
|
525
|
+
trig.StartBoundary = startTime
|
526
|
+
trig.EndBoundary = endTime if endTime != '0000-00-00T00:00:00'
|
527
|
+
trig.Enabled = true
|
636
528
|
|
637
|
-
|
638
|
-
repetitionPattern.Duration = "PT#{trigger[:minutes_duration]||0}M"
|
639
|
-
end
|
529
|
+
repetitionPattern = trig.Repetition
|
640
530
|
|
641
|
-
|
642
|
-
|
643
|
-
|
531
|
+
if trigger[:minutes_duration].to_i > 0
|
532
|
+
repetitionPattern.Duration = "PT#{trigger[:minutes_duration]||0}M"
|
533
|
+
end
|
644
534
|
|
645
|
-
|
646
|
-
|
535
|
+
if trigger[:minutes_interval].to_i > 0
|
536
|
+
repetitionPattern.Interval = "PT#{trigger[:minutes_interval]||0}M"
|
537
|
+
end
|
647
538
|
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
trig.
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
trig.
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
trig.
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
539
|
+
tmp = trigger[:type]
|
540
|
+
tmp = nil unless tmp.is_a?(Hash)
|
541
|
+
|
542
|
+
case trigger[:trigger_type]
|
543
|
+
when TASK_TIME_TRIGGER_DAILY
|
544
|
+
trig.DaysInterval = tmp[:days_interval] if tmp && tmp[:days_interval]
|
545
|
+
if trigger[:random_minutes_interval].to_i > 0
|
546
|
+
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]}M"
|
547
|
+
end
|
548
|
+
when TASK_TIME_TRIGGER_WEEKLY
|
549
|
+
trig.DaysOfWeek = tmp[:days_of_week] if tmp && tmp[:days_of_week]
|
550
|
+
trig.WeeksInterval = tmp[:weeks_interval] if tmp && tmp[:weeks_interval]
|
551
|
+
if trigger[:random_minutes_interval].to_i > 0
|
552
|
+
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
|
553
|
+
end
|
554
|
+
when TASK_TIME_TRIGGER_MONTHLYDATE
|
555
|
+
trig.MonthsOfYear = tmp[:months] if tmp && tmp[:months]
|
556
|
+
trig.DaysOfMonth = tmp[:days] if tmp && tmp[:days]
|
557
|
+
if trigger[:random_minutes_interval].to_i > 0
|
558
|
+
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
|
559
|
+
end
|
560
|
+
trig.RunOnLastDayOfMonth = trigger[:run_on_last_day_of_month] if trigger[:run_on_last_day_of_month]
|
561
|
+
when TASK_TIME_TRIGGER_MONTHLYDOW
|
562
|
+
trig.MonthsOfYear = tmp[:months] if tmp && tmp[:months]
|
563
|
+
trig.DaysOfWeek = tmp[:days_of_week] if tmp && tmp[:days_of_week]
|
564
|
+
trig.WeeksOfMonth = tmp[:weeks_of_month] if tmp && tmp[:weeks_of_month]
|
565
|
+
if trigger[:random_minutes_interval].to_i>0
|
566
|
+
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
|
567
|
+
end
|
568
|
+
trig.RunOnLastWeekOfMonth = trigger[:run_on_last_week_of_month] if trigger[:run_on_last_week_of_month]
|
569
|
+
when TASK_TIME_TRIGGER_ONCE
|
570
|
+
if trigger[:random_minutes_interval].to_i > 0
|
571
|
+
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
|
572
|
+
end
|
573
|
+
when TASK_EVENT_TRIGGER_AT_SYSTEMSTART
|
574
|
+
trig.Delay = "PT#{trigger[:delay_duration]||0}M"
|
575
|
+
when TASK_EVENT_TRIGGER_AT_LOGON
|
576
|
+
trig.UserId = trigger[:user_id] if trigger[:user_id]
|
577
|
+
trig.Delay = "PT#{trigger[:delay_duration]||0}M"
|
578
|
+
end
|
677
579
|
end
|
678
580
|
|
679
581
|
act = taskDefinition.Actions.Create(0)
|
680
582
|
act.Path = 'cmd'
|
681
583
|
|
682
|
-
|
683
584
|
begin
|
684
585
|
@task = @root.RegisterTaskDefinition(
|
685
586
|
task,
|
@@ -756,59 +657,60 @@ module Win32
|
|
756
657
|
end
|
757
658
|
|
758
659
|
trigger = {}
|
759
|
-
trigger[:start_year], trigger[:start_month],
|
760
|
-
trigger[:start_day], trigger[:start_hour],
|
761
|
-
trigger[:start_minute] = trig.StartBoundary.scan(/(\d+)-(\d+)-(\d+)T(\d+):(\d+)/).first
|
762
|
-
|
763
|
-
trigger[:end_year], trigger[:end_month],
|
764
|
-
trigger[:end_day] = trig.StartBoundary.scan(/(\d+)-(\d+)-(\d+)T/).first
|
765
|
-
|
766
|
-
if trig.Repetition.Duration != ""
|
767
|
-
trigger[:minutes_duration] = trig.Repetition.Duration.scan(/(\d+)M/)[0][0].to_i
|
768
|
-
end
|
769
|
-
|
770
|
-
if trig.Repetition.Interval != ""
|
771
|
-
trigger[:minutes_interval] = trig.Repetition.Interval.scan(/(\d+)M/)[0][0].to_i
|
772
|
-
end
|
773
|
-
|
774
|
-
if trig.RandomDelay != ""
|
775
|
-
trigger[:random_minutes_interval] = trig.RandomDelay.scan(/(\d+)M/)[0][0].to_i
|
776
|
-
end
|
777
660
|
|
778
661
|
case trig.Type
|
779
|
-
when
|
780
|
-
trigger[:trigger_type] = TASK_TIME_TRIGGER_DAILY
|
662
|
+
when TASK_TIME_TRIGGER_DAILY
|
781
663
|
tmp = {}
|
782
664
|
tmp[:days_interval] = trig.DaysInterval
|
783
665
|
trigger[:type] = tmp
|
784
|
-
|
785
|
-
|
666
|
+
trigger[:random_minutes_interval] = time_in_minutes(trig.RandomDelay)
|
667
|
+
when TASK_TIME_TRIGGER_WEEKLY
|
786
668
|
tmp = {}
|
787
669
|
tmp[:weeks_interval] = trig.WeeksInterval
|
788
670
|
tmp[:days_of_week] = trig.DaysOfWeek
|
789
671
|
trigger[:type] = tmp
|
790
|
-
|
791
|
-
|
672
|
+
trigger[:random_minutes_interval] = time_in_minutes(trig.RandomDelay)
|
673
|
+
when TASK_TIME_TRIGGER_MONTHLYDATE
|
792
674
|
tmp = {}
|
793
675
|
tmp[:months] = trig.MonthsOfYear
|
794
676
|
tmp[:days] = trig.DaysOfMonth
|
795
677
|
trigger[:type] = tmp
|
796
|
-
|
797
|
-
trigger[:
|
678
|
+
trigger[:random_minutes_interval] = time_in_minutes(trig.RandomDelay)
|
679
|
+
trigger[:run_on_last_day_of_month] = trig.RunOnLastDayOfMonth
|
680
|
+
when TASK_TIME_TRIGGER_MONTHLYDOW
|
798
681
|
tmp = {}
|
799
682
|
tmp[:months] = trig.MonthsOfYear
|
800
683
|
tmp[:days_of_week] = trig.DaysOfWeek
|
801
|
-
tmp[:
|
684
|
+
tmp[:weeks_of_month] = trig.WeeksOfMonth
|
802
685
|
trigger[:type] = tmp
|
803
|
-
|
804
|
-
trigger[:
|
686
|
+
trigger[:random_minutes_interval] = time_in_minutes(trig.RandomDelay)
|
687
|
+
trigger[:run_on_last_week_of_month] = trig.RunOnLastWeekOfMonth
|
688
|
+
when TASK_TIME_TRIGGER_ONCE
|
805
689
|
tmp = {}
|
806
690
|
tmp[:once] = nil
|
807
691
|
trigger[:type] = tmp
|
692
|
+
trigger[:random_minutes_interval] = time_in_minutes(trig.RandomDelay)
|
693
|
+
when TASK_EVENT_TRIGGER_AT_SYSTEMSTART
|
694
|
+
trigger[:delay_duration] = time_in_minutes(trig.Delay)
|
695
|
+
when TASK_EVENT_TRIGGER_AT_LOGON
|
696
|
+
trigger[:user_id] = trig.UserId if trig.UserId.to_s != ""
|
697
|
+
trigger[:delay_duration] = time_in_minutes(trig.Delay)
|
698
|
+
when TASK_EVENT_TRIGGER_ON_IDLE
|
699
|
+
trigger[:execution_time_limit] = time_in_minutes(trig.ExecutionTimeLimit)
|
808
700
|
else
|
809
701
|
raise Error, 'Unknown trigger type'
|
810
702
|
end
|
811
703
|
|
704
|
+
trigger[:start_year], trigger[:start_month], trigger[:start_day],
|
705
|
+
trigger[:start_hour], trigger[:start_minute] = trig.StartBoundary.scan(/(\d+)-(\d+)-(\d+)T(\d+):(\d+)/).first
|
706
|
+
|
707
|
+
trigger[:end_year], trigger[:end_month],
|
708
|
+
trigger[:end_day] = trig.EndBoundary.scan(/(\d+)-(\d+)-(\d+)T/).first
|
709
|
+
|
710
|
+
trigger[:minutes_duration] = time_in_minutes(trig.Repetition.Duration)
|
711
|
+
trigger[:minutes_interval] = time_in_minutes(trig.Repetition.Interval)
|
712
|
+
trigger[:trigger_type] = trig.Type
|
713
|
+
|
812
714
|
trigger
|
813
715
|
end
|
814
716
|
|
@@ -838,6 +740,8 @@ module Win32
|
|
838
740
|
#
|
839
741
|
def trigger=(trigger)
|
840
742
|
raise TypeError unless trigger.is_a?(Hash)
|
743
|
+
raise ArgumentError, 'Unknown trigger type' unless valid_trigger_option(trigger[:trigger_type])
|
744
|
+
|
841
745
|
check_for_active_task
|
842
746
|
|
843
747
|
validate_trigger(trigger)
|
@@ -845,27 +749,6 @@ module Win32
|
|
845
749
|
definition = @task.Definition
|
846
750
|
definition.Triggers.Clear()
|
847
751
|
|
848
|
-
case trigger[:trigger_type]
|
849
|
-
when TASK_TIME_TRIGGER_ONCE
|
850
|
-
type = 1
|
851
|
-
when TASK_TIME_TRIGGER_DAILY
|
852
|
-
type = 2
|
853
|
-
when TASK_TIME_TRIGGER_WEEKLY
|
854
|
-
type = 3
|
855
|
-
when TASK_TIME_TRIGGER_MONTHLYDATE
|
856
|
-
type = 4
|
857
|
-
when TASK_TIME_TRIGGER_MONTHLYDOW
|
858
|
-
type = 5
|
859
|
-
when TASK_EVENT_TRIGGER_ON_IDLE
|
860
|
-
type = 6
|
861
|
-
when TASK_EVENT_TRIGGER_AT_SYSTEM_START
|
862
|
-
type = 8
|
863
|
-
when TASK_EVENT_TRIGGER_AT_LOGON
|
864
|
-
type = 9
|
865
|
-
else
|
866
|
-
raise Error, 'Unknown trigger type'
|
867
|
-
end
|
868
|
-
|
869
752
|
startTime = "%04d-%02d-%02dT%02d:%02d:00" % [
|
870
753
|
trigger[:start_year], trigger[:start_month],
|
871
754
|
trigger[:start_day], trigger[:start_hour], trigger[:start_minute]
|
@@ -875,7 +758,7 @@ module Win32
|
|
875
758
|
trigger[:end_year], trigger[:end_month], trigger[:end_day]
|
876
759
|
]
|
877
760
|
|
878
|
-
trig = definition.Triggers.Create(
|
761
|
+
trig = definition.Triggers.Create( trigger[:trigger_type].to_i )
|
879
762
|
trig.Id = "RegistrationTriggerId#{definition.Triggers.Count}"
|
880
763
|
trig.StartBoundary = startTime
|
881
764
|
trig.EndBoundary = endTime if endTime != '0000-00-00T00:00:00'
|
@@ -912,17 +795,29 @@ module Win32
|
|
912
795
|
if trigger[:random_minutes_interval].to_i > 0
|
913
796
|
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
|
914
797
|
end
|
798
|
+
trig.RunOnLastDayOfMonth = trigger[:run_on_last_day_of_month] if trigger[:run_on_last_day_of_month]
|
915
799
|
when TASK_TIME_TRIGGER_MONTHLYDOW
|
916
800
|
trig.MonthsOfYear = tmp[:months] if tmp && tmp[:months]
|
917
801
|
trig.DaysOfWeek = tmp[:days_of_week] if tmp && tmp[:days_of_week]
|
918
|
-
trig.WeeksOfMonth = tmp[:
|
802
|
+
trig.WeeksOfMonth = tmp[:weeks_of_month] if tmp && tmp[:weeks_of_month]
|
919
803
|
if trigger[:random_minutes_interval].to_i > 0
|
920
804
|
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
|
921
805
|
end
|
806
|
+
trig.RunOnLastWeekOfMonth = trigger[:run_on_last_week_of_month] if trigger[:run_on_last_week_of_month]
|
922
807
|
when TASK_TIME_TRIGGER_ONCE
|
923
808
|
if trigger[:random_minutes_interval].to_i > 0
|
924
809
|
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
|
925
810
|
end
|
811
|
+
when TASK_EVENT_TRIGGER_AT_SYSTEMSTART
|
812
|
+
trig.Delay = "PT#{trigger[:delay_duration]||0}M"
|
813
|
+
when TASK_EVENT_TRIGGER_AT_LOGON
|
814
|
+
trig.UserId = trigger[:user_id] if trigger[:user_id]
|
815
|
+
trig.Delay = "PT#{trigger[:delay_duration]||0}M"
|
816
|
+
when TASK_EVENT_TRIGGER_ON_IDLE
|
817
|
+
# for setting execution time limit Ref : https://msdn.microsoft.com/en-us/library/windows/desktop/aa380724(v=vs.85).aspx
|
818
|
+
if trigger[:execution_time_limit].to_i > 0
|
819
|
+
trig.ExecutionTimeLimit = "PT#{trigger[:execution_time_limit]||0}M"
|
820
|
+
end
|
926
821
|
end
|
927
822
|
|
928
823
|
update_task_definition(definition)
|
@@ -935,23 +830,11 @@ module Win32
|
|
935
830
|
def add_trigger(index, trigger)
|
936
831
|
raise TypeError unless index.is_a?(Numeric)
|
937
832
|
raise TypeError unless trigger.is_a?(Hash)
|
833
|
+
raise ArgumentError, 'Unknown trigger type' unless valid_trigger_option(trigger[:trigger_type])
|
834
|
+
|
938
835
|
check_for_active_task
|
939
836
|
|
940
837
|
definition = @task.Definition
|
941
|
-
case trigger[:trigger_type]
|
942
|
-
when TASK_TIME_TRIGGER_DAILY
|
943
|
-
type = 2
|
944
|
-
when TASK_TIME_TRIGGER_WEEKLY
|
945
|
-
type = 3
|
946
|
-
when TASK_TIME_TRIGGER_MONTHLYDATE
|
947
|
-
type = 4
|
948
|
-
when TASK_TIME_TRIGGER_MONTHLYDOW
|
949
|
-
type = 5
|
950
|
-
when TASK_TIME_TRIGGER_ONCE
|
951
|
-
type = 1
|
952
|
-
else
|
953
|
-
raise Error, 'Unknown trigger type'
|
954
|
-
end
|
955
838
|
|
956
839
|
startTime = "%04d-%02d-%02dT%02d:%02d:00" % [
|
957
840
|
trigger[:start_year], trigger[:start_month], trigger[:start_day],
|
@@ -967,7 +850,7 @@ module Win32
|
|
967
850
|
trigger[:end_year], trigger[:end_month], trigger[:end_day]
|
968
851
|
]
|
969
852
|
|
970
|
-
trig = definition.Triggers.Create(
|
853
|
+
trig = definition.Triggers.Create( trigger[:trigger_type].to_i )
|
971
854
|
trig.Id = "RegistrationTriggerId#{definition.Triggers.Count}"
|
972
855
|
trig.StartBoundary = startTime
|
973
856
|
trig.EndBoundary = endTime if endTime != '0000-00-00T00:00:00'
|
@@ -1002,19 +885,26 @@ module Win32
|
|
1002
885
|
trig.MonthsOfYear = tmp[:months] if tmp && tmp[:months]
|
1003
886
|
trig.DaysOfMonth = tmp[:days] if tmp && tmp[:days]
|
1004
887
|
if trigger[:random_minutes_interval].to_i > 0
|
1005
|
-
|
888
|
+
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
|
1006
889
|
end
|
890
|
+
trig.RunOnLastDayOfMonth = trigger[:run_on_last_day_of_month] if trigger[:run_on_last_day_of_month]
|
1007
891
|
when TASK_TIME_TRIGGER_MONTHLYDOW
|
1008
892
|
trig.MonthsOfYear = tmp[:months] if tmp && tmp[:months]
|
1009
893
|
trig.DaysOfWeek = tmp[:days_of_week] if tmp && tmp[:days_of_week]
|
1010
|
-
trig.WeeksOfMonth = tmp[:
|
894
|
+
trig.WeeksOfMonth = tmp[:weeks_of_month] if tmp && tmp[:weeks_of_month]
|
1011
895
|
if trigger[:random_minutes_interval].to_i > 0
|
1012
896
|
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
|
1013
897
|
end
|
898
|
+
trig.RunOnLastWeekOfMonth = trigger[:run_on_last_week_of_month] if trigger[:run_on_last_week_of_month]
|
1014
899
|
when TASK_TIME_TRIGGER_ONCE
|
1015
900
|
if trigger[:random_minutes_interval].to_i > 0
|
1016
901
|
trig.RandomDelay = "PT#{trigger[:random_minutes_interval]||0}M"
|
1017
902
|
end
|
903
|
+
when TASK_EVENT_TRIGGER_AT_SYSTEMSTART
|
904
|
+
trig.Delay = "PT#{trigger[:delay_duration]||0}M"
|
905
|
+
when TASK_EVENT_TRIGGER_AT_LOGON
|
906
|
+
trig.UserId = trigger[:user_id] if trigger[:user_id]
|
907
|
+
trig.Delay = "PT#{trigger[:delay_duration]||0}M"
|
1018
908
|
end
|
1019
909
|
|
1020
910
|
update_task_definition(definition)
|
@@ -1033,6 +923,8 @@ module Win32
|
|
1033
923
|
status = 'ready'
|
1034
924
|
when 4
|
1035
925
|
status = 'running'
|
926
|
+
when 2
|
927
|
+
status = 'queued'
|
1036
928
|
when 1
|
1037
929
|
status = 'not scheduled'
|
1038
930
|
else
|
@@ -1042,6 +934,12 @@ module Win32
|
|
1042
934
|
status
|
1043
935
|
end
|
1044
936
|
|
937
|
+
# Returns true if current task is enabled
|
938
|
+
def enabled?
|
939
|
+
check_for_active_task
|
940
|
+
@task.enabled
|
941
|
+
end
|
942
|
+
|
1045
943
|
# Returns the exit code from the last scheduled run.
|
1046
944
|
#
|
1047
945
|
def exit_code
|
@@ -1121,6 +1019,25 @@ module Win32
|
|
1121
1019
|
time
|
1122
1020
|
end
|
1123
1021
|
|
1022
|
+
# Returns idle settings for current active task
|
1023
|
+
#
|
1024
|
+
def idle_settings
|
1025
|
+
check_for_active_task
|
1026
|
+
idle_settings = {}
|
1027
|
+
idle_settings[:idle_duration] = @task.Definition.Settings.IdleSettings.IdleDuration
|
1028
|
+
idle_settings[:stop_on_idle_end] = @task.Definition.Settings.IdleSettings.StopOnIdleEnd
|
1029
|
+
idle_settings[:wait_timeout] = @task.Definition.Settings.IdleSettings.WaitTimeout
|
1030
|
+
idle_settings[:restart_on_idle] = @task.Definition.Settings.IdleSettings.RestartOnIdle
|
1031
|
+
idle_settings
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
# Returns the execution time limit for current active task
|
1035
|
+
#
|
1036
|
+
def execution_time_limit
|
1037
|
+
check_for_active_task
|
1038
|
+
@task.Definition.Settings.ExecutionTimeLimit
|
1039
|
+
end
|
1040
|
+
|
1124
1041
|
# Returns the maximum length of time, in milliseconds, that the task
|
1125
1042
|
# will run before terminating.
|
1126
1043
|
#
|
@@ -1203,9 +1120,12 @@ module Win32
|
|
1203
1120
|
delete_expired_task_after = hash[:delete_expired_task_after]
|
1204
1121
|
disallow_start_if_on_batteries = hash[:disallow_start_if_on_batteries]
|
1205
1122
|
enabled = hash[:enabled]
|
1206
|
-
execution_time_limit = hash[:execution_time_limit] || hash[:max_run_time]
|
1123
|
+
execution_time_limit = "PT#{hash[:execution_time_limit] || hash[:max_run_time] || 0}M"
|
1207
1124
|
hidden = hash[:hidden]
|
1208
|
-
|
1125
|
+
idle_duration = "PT#{hash[:idle_duration]||0}M"
|
1126
|
+
stop_on_idle_end = hash[:stop_on_idle_end]
|
1127
|
+
wait_timeout = "PT#{hash[:wait_timeout]||0}M"
|
1128
|
+
restart_on_idle = hash[:restart_on_idle]
|
1209
1129
|
network_settings = hash[:network_settings]
|
1210
1130
|
priority = hash[:priority]
|
1211
1131
|
restart_count = hash[:restart_count]
|
@@ -1225,7 +1145,10 @@ module Win32
|
|
1225
1145
|
definition.Settings.Enabled = enabled if enabled
|
1226
1146
|
definition.Settings.ExecutionTimeLimit = execution_time_limit if execution_time_limit
|
1227
1147
|
definition.Settings.Hidden = hidden if hidden
|
1228
|
-
definition.Settings.IdleSettings =
|
1148
|
+
definition.Settings.IdleSettings.IdleDuration = idle_duration if idle_duration
|
1149
|
+
definition.Settings.IdleSettings.StopOnIdleEnd = stop_on_idle_end if stop_on_idle_end
|
1150
|
+
definition.Settings.IdleSettings.WaitTimeout = wait_timeout if wait_timeout
|
1151
|
+
definition.Settings.IdleSettings.RestartOnIdle = restart_on_idle if restart_on_idle
|
1229
1152
|
definition.Settings.NetworkSettings = network_settings if network_settings
|
1230
1153
|
definition.Settings.Priority = priority if priority
|
1231
1154
|
definition.Settings.RestartCount = restart_count if restart_count
|
@@ -1289,71 +1212,88 @@ module Win32
|
|
1289
1212
|
hash
|
1290
1213
|
end
|
1291
1214
|
|
1292
|
-
#
|
1293
|
-
|
1294
|
-
|
1295
|
-
|
1296
|
-
|
1297
|
-
|
1298
|
-
|
1299
|
-
|
1215
|
+
# Sets the principals for current active task. The principal is hash with following possible options.
|
1216
|
+
# Expected principal hash: { id: STRING, display_name: STRING, user_id: STRING,
|
1217
|
+
# logon_type: INTEGER, group_id: STRING, run_level: INTEGER }
|
1218
|
+
#
|
1219
|
+
def configure_principals(principals)
|
1220
|
+
raise TypeError unless principals.is_a?(Hash)
|
1221
|
+
check_for_active_task
|
1222
|
+
definition = @task.Definition
|
1223
|
+
definition.Principal.Id = principals[:id] if principals[:id].to_s != ""
|
1224
|
+
definition.Principal.DisplayName = principals[:display_name] if principals[:display_name].to_s != ""
|
1225
|
+
definition.Principal.UserId = principals[:user_id] if principals[:user_id].to_s != ""
|
1226
|
+
definition.Principal.LogonType = principals[:logon_type] if principals[:logon_type].to_s != ""
|
1227
|
+
definition.Principal.GroupId = principals[:group_id] if principals[:group_id].to_s != ""
|
1228
|
+
definition.Principal.RunLevel = principals[:run_level] if principals[:run_level].to_s != ""
|
1229
|
+
update_task_definition(definition)
|
1230
|
+
principals
|
1231
|
+
end
|
1300
1232
|
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1233
|
+
# Returns a hash containing all the principal information of the current task
|
1234
|
+
def principals
|
1235
|
+
check_for_active_task
|
1236
|
+
principals_hash = {}
|
1237
|
+
@task.Definition.Principal.ole_get_methods.each do |principal|
|
1238
|
+
principals_hash[principal.name] = @task.Definition.Principal._getproperty(principal.dispid, [], [])
|
1239
|
+
end
|
1240
|
+
symbolize_keys(principals_hash)
|
1241
|
+
end
|
1306
1242
|
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
SUNDAY = TASK_SUNDAY
|
1316
|
-
MONDAY = TASK_MONDAY
|
1317
|
-
TUESDAY = TASK_TUESDAY
|
1318
|
-
WEDNESDAY = TASK_WEDNESDAY
|
1319
|
-
THURSDAY = TASK_THURSDAY
|
1320
|
-
FRIDAY = TASK_FRIDAY
|
1321
|
-
SATURDAY = TASK_SATURDAY
|
1322
|
-
JANUARY = TASK_JANUARY
|
1323
|
-
FEBRUARY = TASK_FEBRUARY
|
1324
|
-
MARCH = TASK_MARCH
|
1325
|
-
APRIL = TASK_APRIL
|
1326
|
-
MAY = TASK_MAY
|
1327
|
-
JUNE = TASK_JUNE
|
1328
|
-
JULY = TASK_JULY
|
1329
|
-
AUGUST = TASK_AUGUST
|
1330
|
-
SEPTEMBER = TASK_SEPTEMBER
|
1331
|
-
OCTOBER = TASK_OCTOBER
|
1332
|
-
NOVEMBER = TASK_NOVEMBER
|
1333
|
-
DECEMBER = TASK_DECEMBER
|
1243
|
+
# Returns a hash containing all settings of the current task
|
1244
|
+
def settings
|
1245
|
+
check_for_active_task
|
1246
|
+
settings_hash = {}
|
1247
|
+
@task.Definition.Settings.ole_get_methods.each do |setting|
|
1248
|
+
next if setting.name == "XmlText" # not needed
|
1249
|
+
settings_hash[setting.name] = @task.Definition.Settings._getproperty(setting.dispid, [], [])
|
1250
|
+
end
|
1334
1251
|
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1339
|
-
KILL_ON_IDLE_END = TASK_FLAG_KILL_ON_IDLE_END
|
1340
|
-
DONT_START_IF_ON_BATTERIES = TASK_FLAG_DONT_START_IF_ON_BATTERIES
|
1341
|
-
KILL_IF_GOING_ON_BATTERIES = TASK_FLAG_KILL_IF_GOING_ON_BATTERIES
|
1342
|
-
RUN_ONLY_IF_DOCKED = TASK_FLAG_RUN_ONLY_IF_DOCKED
|
1343
|
-
HIDDEN = TASK_FLAG_HIDDEN
|
1344
|
-
RUN_IF_CONNECTED_TO_INTERNET = TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET
|
1345
|
-
RESTART_ON_IDLE_RESUME = TASK_FLAG_RESTART_ON_IDLE_RESUME
|
1346
|
-
SYSTEM_REQUIRED = TASK_FLAG_SYSTEM_REQUIRED
|
1347
|
-
RUN_ONLY_IF_LOGGED_ON = TASK_FLAG_RUN_ONLY_IF_LOGGED_ON
|
1252
|
+
settings_hash["IdleSettings"] = idle_settings
|
1253
|
+
settings_hash["NetworkSettings"] = network_settings
|
1254
|
+
symbolize_keys(settings_hash)
|
1255
|
+
end
|
1348
1256
|
|
1349
|
-
|
1350
|
-
|
1351
|
-
|
1257
|
+
# Returns a hash of idle settings of the current task
|
1258
|
+
def idle_settings
|
1259
|
+
check_for_active_task
|
1260
|
+
settings_hash = {}
|
1261
|
+
@task.Definition.Settings.IdleSettings.ole_get_methods.each do |setting|
|
1262
|
+
settings_hash[setting.name] = @task.Definition.Settings.IdleSettings._getproperty(setting.dispid, [], [])
|
1263
|
+
end
|
1264
|
+
symbolize_keys(settings_hash)
|
1265
|
+
end
|
1352
1266
|
|
1353
|
-
|
1267
|
+
# Returns a hash of network settings of the current task
|
1268
|
+
def network_settings
|
1269
|
+
check_for_active_task
|
1270
|
+
settings_hash = {}
|
1271
|
+
@task.Definition.Settings.NetworkSettings.ole_get_methods.each do |setting|
|
1272
|
+
settings_hash[setting.name] = @task.Definition.Settings.NetworkSettings._getproperty(setting.dispid, [], [])
|
1273
|
+
end
|
1274
|
+
symbolize_keys(settings_hash)
|
1275
|
+
end
|
1354
1276
|
|
1355
1277
|
private
|
1356
1278
|
|
1279
|
+
# Returns a camle-case string to its underscore format
|
1280
|
+
def underscore(string)
|
1281
|
+
string.gsub(/([a-z\d])([A-Z])/, '\1_\2'.freeze).downcase
|
1282
|
+
end
|
1283
|
+
|
1284
|
+
# Converts all the keys of a hash to underscored-symbol format
|
1285
|
+
def symbolize_keys(hash)
|
1286
|
+
hash.each_with_object({}) do |(k, v), h|
|
1287
|
+
h[underscore(k.to_s).to_sym] = v.is_a?(Hash) ? symbolize_keys(v) : v
|
1288
|
+
end
|
1289
|
+
end
|
1290
|
+
|
1291
|
+
def valid_trigger_option(trigger_type)
|
1292
|
+
[ TASK_TIME_TRIGGER_ONCE, TASK_TIME_TRIGGER_DAILY, TASK_TIME_TRIGGER_WEEKLY,
|
1293
|
+
TASK_TIME_TRIGGER_MONTHLYDATE, TASK_TIME_TRIGGER_MONTHLYDOW, TASK_EVENT_TRIGGER_ON_IDLE,
|
1294
|
+
TASK_EVENT_TRIGGER_AT_SYSTEMSTART, TASK_EVENT_TRIGGER_AT_LOGON ].include?(trigger_type.to_i)
|
1295
|
+
end
|
1296
|
+
|
1357
1297
|
def validate_trigger(hash)
|
1358
1298
|
[:start_year, :start_month, :start_day].each{ |key|
|
1359
1299
|
raise ArgumentError, "#{key} must be set" unless hash[key]
|
@@ -1380,4 +1320,5 @@ module Win32
|
|
1380
1320
|
raise Error, ole_error(method_name, err)
|
1381
1321
|
end
|
1382
1322
|
end
|
1323
|
+
# :stopdoc:
|
1383
1324
|
end
|