win32-service 1.0.1 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/win32/daemon.rb +2 -1
- data/lib/win32/service.rb +176 -85
- data/lib/win32/windows/functions.rb +1 -1
- data/lib/win32/windows/structs.rb +1 -15
- data/lib/win32/windows/version.rb +1 -1
- metadata +50 -39
- data/CHANGELOG.md +0 -347
- data/Gemfile +0 -5
- data/MANIFEST +0 -24
- data/README.md +0 -75
- data/Rakefile +0 -83
- data/VERSION +0 -1
- data/appveyor.yml +0 -48
- data/doc/daemon.txt +0 -157
- data/doc/service.txt +0 -363
- data/examples/demo_daemon.rb +0 -96
- data/examples/demo_daemon_ctl.rb +0 -123
- data/examples/demo_services.rb +0 -30
- data/test/test_win32_daemon.rb +0 -58
- data/test/test_win32_service.rb +0 -468
- data/test/test_win32_service_configure.rb +0 -110
- data/test/test_win32_service_create.rb +0 -153
- data/test/test_win32_service_info.rb +0 -189
- data/test/test_win32_service_status.rb +0 -110
- data/win32-service.gemspec +0 -41
data/Gemfile
DELETED
data/MANIFEST
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
* MANIFEST
|
2
|
-
* CHANGES
|
3
|
-
* README
|
4
|
-
* Rakefile
|
5
|
-
* win32-service.gemspec
|
6
|
-
* certs/djberg96_pub.pem
|
7
|
-
* doc/daemon.txt
|
8
|
-
* doc/service.txt
|
9
|
-
* examples/demo_daemon.rb
|
10
|
-
* examples/demo_daemon_ctl.rb
|
11
|
-
* examples/demo_services.rb
|
12
|
-
* lib/win32-daemon.rb
|
13
|
-
* lib/win32-service.rb
|
14
|
-
* lib/win32/service.rb
|
15
|
-
* lib/win32/daemon.rb
|
16
|
-
* lib/win32/windows/constants.rb
|
17
|
-
* lib/win32/windows/functions.rb
|
18
|
-
* lib/win32/windows/structs.rb
|
19
|
-
* test/test_win32_daemon.rb
|
20
|
-
* test/test_win32_service_configure.rb
|
21
|
-
* test/test_win32_service_create.rb
|
22
|
-
* test/test_win32_service_info.rb
|
23
|
-
* test/test_win32_service_status.rb
|
24
|
-
* test/test_win32_service.rb
|
data/README.md
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
# win32-service
|
2
|
-
|
3
|
-
[![Gem Version](https://badge.fury.io/rb/win32-service.svg)](https://badge.fury.io/rb/win32-service)
|
4
|
-
|
5
|
-
The win32-service library allows you to control or create MS Windows services.
|
6
|
-
|
7
|
-
## Installation
|
8
|
-
|
9
|
-
gem install win32-service
|
10
|
-
|
11
|
-
## Usage
|
12
|
-
|
13
|
-
```ruby
|
14
|
-
require 'win32/service'
|
15
|
-
|
16
|
-
# Iterate over the available services
|
17
|
-
Win32::Service.services do |service|
|
18
|
-
p service
|
19
|
-
end
|
20
|
-
```
|
21
|
-
|
22
|
-
## More Documentation
|
23
|
-
|
24
|
-
Please see the documentation in the 'doc' directory, or the gem documentation that was installed when you installed this library as a gem.
|
25
|
-
|
26
|
-
## Known Issues
|
27
|
-
|
28
|
-
### Problem:
|
29
|
-
|
30
|
-
Service.delete causes "Unable to delete: The specified service has been marked for deletion."
|
31
|
-
|
32
|
-
### Troubleshooting:
|
33
|
-
|
34
|
-
This can be caused by one of two things. Either you attempted to delete a running service without stopping it first, or you have the Services Administrative Tool (GUI) open. In the former case, the solution is to first stop the service if it's running. In the latter, close the Services GUI admin tool before deleting.
|
35
|
-
|
36
|
-
### Problem:
|
37
|
-
|
38
|
-
Service.start causes, "The service did not respond to the start or control request in a timely fashion."
|
39
|
-
|
40
|
-
### Troubleshooting:
|
41
|
-
|
42
|
-
The best way to debug your services is to wrap your entire Daemon subclass in a begin/end block and send error messages to a file. That should give a good clue as to the nature of the problem. The most probable culprits are:
|
43
|
-
|
44
|
-
- You forgot to require 'win32/daemon' in your Daemon code.
|
45
|
-
|
46
|
-
- You've tried to require a library that's not in your $LOAD_PATH. Make sure that your require statements are inside the begin/rescue block so that you can easily find those mistakes.
|
47
|
-
|
48
|
-
- Your have a bad binary path name. Be sure to use an absolute path name for the binary path name, including the full path to the Ruby interpreter, e.g. 'c:\ruby\bin\ruby' instead of just 'ruby'.
|
49
|
-
|
50
|
-
- You've got a syntax error in your code somewhere.
|
51
|
-
|
52
|
-
## See Also
|
53
|
-
|
54
|
-
ruby-wmi
|
55
|
-
|
56
|
-
## Future Plans
|
57
|
-
|
58
|
-
Add service_session_change hook
|
59
|
-
|
60
|
-
## Copyright
|
61
|
-
|
62
|
-
(C) 2003-2018, Daniel J. Berger, All Rights Reserved
|
63
|
-
|
64
|
-
## License
|
65
|
-
|
66
|
-
Artistic 2.0
|
67
|
-
|
68
|
-
## Warranty
|
69
|
-
|
70
|
-
This package is provided "as is" and without any express or implied warranties, including, without limitation, the implied warranties of merchantability and fitness for a particular purpose.
|
71
|
-
|
72
|
-
## Authors
|
73
|
-
|
74
|
-
- Daniel J. Berger
|
75
|
-
- Park Heesob
|
data/Rakefile
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require 'rake'
|
3
|
-
require 'rake/clean'
|
4
|
-
require 'rake/testtask'
|
5
|
-
require 'rbconfig'
|
6
|
-
include RbConfig
|
7
|
-
|
8
|
-
CLEAN.include(
|
9
|
-
'**/*.gem', # Gem files
|
10
|
-
'**/*.rbc' # Rubinius
|
11
|
-
)
|
12
|
-
|
13
|
-
namespace :example do
|
14
|
-
desc "Run the services example program."
|
15
|
-
task :services do
|
16
|
-
sh "ruby -Ilib examples/demo_services.rb"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
namespace 'test' do
|
21
|
-
desc 'Run all tests for the win32-service library'
|
22
|
-
Rake::TestTask.new('all') do |t|
|
23
|
-
t.verbose = true
|
24
|
-
t.warning = true
|
25
|
-
end
|
26
|
-
|
27
|
-
desc 'Run the tests for the Win32::Daemon class'
|
28
|
-
Rake::TestTask.new('daemon') do |t|
|
29
|
-
task :daemon
|
30
|
-
t.verbose = true
|
31
|
-
t.warning = true
|
32
|
-
t.test_files = FileList['test/test_win32_daemon.rb']
|
33
|
-
end
|
34
|
-
|
35
|
-
namespace 'service' do
|
36
|
-
desc 'Run the tests for the Win32::Service class'
|
37
|
-
Rake::TestTask.new('all') do |t|
|
38
|
-
t.verbose = true
|
39
|
-
t.warning = true
|
40
|
-
t.test_files = FileList['test/test_win32_service*.rb']
|
41
|
-
end
|
42
|
-
|
43
|
-
Rake::TestTask.new('configure') do |t|
|
44
|
-
t.verbose = true
|
45
|
-
t.warning = true
|
46
|
-
t.test_files = FileList['test/test_win32_service_configure.rb']
|
47
|
-
end
|
48
|
-
|
49
|
-
Rake::TestTask.new('control') do |t|
|
50
|
-
t.verbose = true
|
51
|
-
t.warning = true
|
52
|
-
t.test_files = FileList['test/test_win32_service.rb']
|
53
|
-
end
|
54
|
-
|
55
|
-
Rake::TestTask.new('create') do |t|
|
56
|
-
t.verbose = true
|
57
|
-
t.warning = true
|
58
|
-
t.test_files = FileList['test/test_win32_service_create.rb']
|
59
|
-
end
|
60
|
-
|
61
|
-
Rake::TestTask.new('info') do |t|
|
62
|
-
t.verbose = true
|
63
|
-
t.warning = true
|
64
|
-
t.test_files = FileList['test/test_win32_service_info.rb']
|
65
|
-
end
|
66
|
-
|
67
|
-
Rake::TestTask.new('status') do |t|
|
68
|
-
t.verbose = true
|
69
|
-
t.warning = true
|
70
|
-
t.test_files = FileList['test/test_win32_service_status.rb']
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
task :all do
|
75
|
-
Rake.application[:clean].execute
|
76
|
-
end
|
77
|
-
|
78
|
-
task :daemon do
|
79
|
-
Rake.application[:clean].execute
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
task :default => 'test:all'
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.0.1
|
data/appveyor.yml
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
version: '{build}'
|
2
|
-
branches:
|
3
|
-
only:
|
4
|
-
- ffi
|
5
|
-
skip_tags: true
|
6
|
-
clone_depth: 10
|
7
|
-
environment:
|
8
|
-
matrix:
|
9
|
-
- ruby_version: 193
|
10
|
-
ruby_dir: 1.9.1
|
11
|
-
- ruby_version: 200
|
12
|
-
ruby_dir: 2.0.0
|
13
|
-
- ruby_version: 200-x64
|
14
|
-
ruby_dir: 2.0.0
|
15
|
-
- ruby_version: 21
|
16
|
-
ruby_dir: 2.1.0
|
17
|
-
- ruby_version: 21-x64
|
18
|
-
ruby_dir: 2.1.0
|
19
|
-
- ruby_version: 22
|
20
|
-
ruby_dir: 2.2.0
|
21
|
-
- ruby_version: 22-x64
|
22
|
-
ruby_dir: 2.2.0
|
23
|
-
install:
|
24
|
-
- ps: >-
|
25
|
-
$env:path = "C:\Ruby" + $env:ruby_version + "\bin;" + $env:path
|
26
|
-
|
27
|
-
$tpath = "C:\Ruby" + $env:ruby_version + "\lib\ruby\" + $env:ruby_dir + "\test"
|
28
|
-
|
29
|
-
if ((test-path $tpath) -eq $True){ rm -recurse -force $tpath }
|
30
|
-
|
31
|
-
gem update --system > $null
|
32
|
-
|
33
|
-
if ((gem query -i ffi) -eq $False){ gem install ffi --no-document }
|
34
|
-
|
35
|
-
if ((gem query -i win32-security) -eq $False){ gem install win32-security --no-document }
|
36
|
-
|
37
|
-
if ((gem query -i test-unit -v ">= 3.0") -eq $False){ gem install test-unit --no-document }
|
38
|
-
cache:
|
39
|
-
- C:\Ruby193\lib\ruby\gems\1.9.1
|
40
|
-
- C:\Ruby200\lib\ruby\gems\2.0.0
|
41
|
-
- C:\Ruby200-x64\lib\ruby\gems\2.0.0
|
42
|
-
- C:\Ruby21\lib\ruby\gems\2.1.0
|
43
|
-
- C:\Ruby21-x64\lib\ruby\gems\2.1.0
|
44
|
-
- C:\Ruby22\lib\ruby\gems\2.2.0
|
45
|
-
- C:\Ruby22-x64\lib\ruby\gems\2.2.0
|
46
|
-
build: off
|
47
|
-
test_script:
|
48
|
-
- cmd: rake
|
data/doc/daemon.txt
DELETED
@@ -1,157 +0,0 @@
|
|
1
|
-
= Description
|
2
|
-
The Daemon class is a wrapper class that allows you to run your code as a
|
3
|
-
Windows service.
|
4
|
-
|
5
|
-
= Synopsis
|
6
|
-
class Daemon
|
7
|
-
def service_main
|
8
|
-
while running?
|
9
|
-
sleep 3
|
10
|
-
File.open("c:\\test.log", "a"){ |f| f.puts "service is running" }
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
Daemon.mainloop
|
16
|
-
|
17
|
-
= Singleton Methods
|
18
|
-
Daemon.mainloop
|
19
|
-
This is the method that actually puts your code into a loop and allows it
|
20
|
-
to run as a service. The code that is actually run while in the mainloop
|
21
|
-
is what you defined in the Daemon#service_main method.
|
22
|
-
|
23
|
-
= Instance Methods
|
24
|
-
Daemon#running?
|
25
|
-
Returns whether or not the daemon is running. This is just a shortcut
|
26
|
-
for checking if the state is RUNNING, PAUSED or IDLE.
|
27
|
-
|
28
|
-
This is typically used within your service_main method. See the
|
29
|
-
demo_daemon.rb file in the 'examples' directory for an example of how it's
|
30
|
-
used in practice.
|
31
|
-
|
32
|
-
Daemon#service_init
|
33
|
-
Any code defined defined within this method occurs before service_main is
|
34
|
-
reached. Any initialization code that takes more than two seconds to
|
35
|
-
execute should be placed here. Otherwise, your service may timeout when
|
36
|
-
you try to start it.
|
37
|
-
|
38
|
-
Daemon#service_main(*args)
|
39
|
-
You are expected to define your own service_main() method. The code
|
40
|
-
defined in this method is the code that will run while running as a
|
41
|
-
service.
|
42
|
-
|
43
|
-
Any +args+ passed to Service.start are passed to this method.
|
44
|
-
|
45
|
-
Daemon#state
|
46
|
-
Returns the current state of the Daemon. For a list of valid states, see
|
47
|
-
the Constants section below.
|
48
|
-
|
49
|
-
= Signal Event Hooks
|
50
|
-
These methods are called if defined within your Daemon class, and the
|
51
|
-
appropriate signal is received by your service.
|
52
|
-
|
53
|
-
Daemon#service_stop
|
54
|
-
Called if the service receives a SERVICE_CONTROL_STOP signal. This is
|
55
|
-
what the Service.stop() method sends.
|
56
|
-
|
57
|
-
Daemon#service_pause
|
58
|
-
Called if the service receives a SERVICE_CONTROL_PAUSE signal. This is
|
59
|
-
what the Service.pause() method sends.
|
60
|
-
|
61
|
-
Daemon#service_resume
|
62
|
-
Called if the service receives a SERVICE_CONTROL_CONTINUE signal. This
|
63
|
-
is what the Service.resume() method sends.
|
64
|
-
|
65
|
-
Daemon#service_interrogate
|
66
|
-
Called if the service receives a SERVICE_CONTROL_INTERROGATE signal. This
|
67
|
-
notifies a service that it should report its current status information to
|
68
|
-
the service control manager.
|
69
|
-
|
70
|
-
Daemon#service_shutdown
|
71
|
-
Called if the service receives a SERVICE_CONTROL_SHUTDOWN signal.
|
72
|
-
|
73
|
-
Daemon#service_netbindadd
|
74
|
-
Called if the service receives a SERVICE_CONTROL_NETBINDADD signal. This
|
75
|
-
notifies a network service that there is a new component for binding.
|
76
|
-
|
77
|
-
Daemon#service_netbinddisable
|
78
|
-
Called if the service receives a SERVICE_CONTROL_NETBINDDISABLE signal.
|
79
|
-
This notifies a network service that one of its bindings has been
|
80
|
-
disabled.
|
81
|
-
|
82
|
-
Daemon#service_netbindenable
|
83
|
-
Called if the service receives a SERVICE_CONTROL_NETBINDENABLE signal.
|
84
|
-
This Notifies a network service that a disabled binding has been enabled.
|
85
|
-
|
86
|
-
Daemon#service_netbindremove
|
87
|
-
Called if the service receives a SERVICE_CONTROL_NETBINDREMOVE signal.
|
88
|
-
This notifies a network service that that a component for binding has
|
89
|
-
been removed.
|
90
|
-
|
91
|
-
Daemon#service_paramchange
|
92
|
-
Called if the service receives a SERVICE_CONTROL_PARAMCHANGE signal.
|
93
|
-
This notifies a service that its startup parameters have changed.
|
94
|
-
|
95
|
-
= Constants
|
96
|
-
|
97
|
-
=== Service state constants
|
98
|
-
Daemon::CONTINUE_PENDING
|
99
|
-
The service continue is pending.
|
100
|
-
|
101
|
-
Daemon::PAUSE_PENDING
|
102
|
-
The service pause is pending.
|
103
|
-
|
104
|
-
Daemon::PAUSED
|
105
|
-
The service is paused (but not STOPPED).
|
106
|
-
|
107
|
-
Daemon::RUNNING
|
108
|
-
The service is running.
|
109
|
-
|
110
|
-
Daemon::START_PENDING
|
111
|
-
The service is starting (but is not yet in a RUNNING state).
|
112
|
-
|
113
|
-
Daemon::STOP_PENDING
|
114
|
-
The service is stopping (but is not yet in a STOPPED state).
|
115
|
-
|
116
|
-
Daemon::STOPPED
|
117
|
-
The service is not running.
|
118
|
-
|
119
|
-
Daemon::IDLE
|
120
|
-
The service is running, in an idle state. This is a custom state that
|
121
|
-
we added that gets around a thread blocking issue.
|
122
|
-
|
123
|
-
= Notes
|
124
|
-
You must create a service before you can actually run it. Look in the
|
125
|
-
examples directory for the files 'demo_daemon.rb' and 'demodaemon_ctl.rb'.
|
126
|
-
They're small and straightforward examples of how to control, install and
|
127
|
-
setup your own Daemon.
|
128
|
-
|
129
|
-
= Known Bugs
|
130
|
-
None known. Please report any bugs you find on the issue tracker at
|
131
|
-
https//github.com/djberg96/win32-service
|
132
|
-
|
133
|
-
= Future Plans
|
134
|
-
None at this time.
|
135
|
-
|
136
|
-
Suggestions welcome. Please post them on the github project page at
|
137
|
-
https//github.com/djberg96/win32-service
|
138
|
-
|
139
|
-
= Acknowledgements
|
140
|
-
Many thanks go to Patrick Hurley for providing the fix for the thread
|
141
|
-
blocking issue for the original C code. Thanks also go to Kevin Burge for
|
142
|
-
his patch that solved service responsiveness issues.
|
143
|
-
|
144
|
-
= Copyright
|
145
|
-
(C) 2003-2016 Daniel J. Berger, All Rights Reserved
|
146
|
-
|
147
|
-
= License
|
148
|
-
Artistic 2.0
|
149
|
-
|
150
|
-
= Warranty
|
151
|
-
This package is provided "as is" and without any express or
|
152
|
-
implied warranties, including, without limitation, the implied
|
153
|
-
warranties of merchantability and fitness for a particular purpose.
|
154
|
-
|
155
|
-
= Author(s)
|
156
|
-
* Daniel J. Berger
|
157
|
-
* Park Heesob
|
data/doc/service.txt
DELETED
@@ -1,363 +0,0 @@
|
|
1
|
-
= Description
|
2
|
-
An interface for MS Windows Services.
|
3
|
-
|
4
|
-
= Prerequisites
|
5
|
-
ffi 1.0 or later
|
6
|
-
|
7
|
-
This library is only supported for the Windows NT family of operating
|
8
|
-
systems, e.g. 2000, XP, 2003, etc. It is NOT supported (and won't
|
9
|
-
work) for any version of DOS or Windows 95/98/ME. It is also not
|
10
|
-
supported on NT 4, as that platform is defunct.
|
11
|
-
|
12
|
-
It should work on Windows XP Home, but is not officially supported for
|
13
|
-
that platform.
|
14
|
-
|
15
|
-
= Synopsis
|
16
|
-
require "win32/service"
|
17
|
-
include Win32
|
18
|
-
|
19
|
-
# Create a new service
|
20
|
-
Service.create(
|
21
|
-
:service_name => 'some_service',
|
22
|
-
:service_type => Service::WIN32_OWN_PROCESS,
|
23
|
-
:description => 'A custom service I wrote just for fun'
|
24
|
-
:start_type => Service::AUTO_START,
|
25
|
-
:error_control => Service::ERROR_NORMAL,
|
26
|
-
:binary_path_name => 'C:\path\to\some_service.exe',
|
27
|
-
:load_order_group => 'Network',
|
28
|
-
:dependencies => ['W32Time','Schedule']
|
29
|
-
:service_start_name => 'SomeDomain\\User',
|
30
|
-
:password => 'XXXXXXX',
|
31
|
-
:display_name => 'This is some service'
|
32
|
-
)
|
33
|
-
|
34
|
-
# Configure a service that already exists
|
35
|
-
Service.configure(:display_name => "My Bar Service")
|
36
|
-
|
37
|
-
Service.start("foo")
|
38
|
-
Service.pause("foo")
|
39
|
-
Service.resume("foo")
|
40
|
-
Service.stop("foo")
|
41
|
-
|
42
|
-
Service.delete("foo")
|
43
|
-
|
44
|
-
Service.get_display_name("Schedule") # "Task Scheduler"
|
45
|
-
Service.get_service_name("ClipBook") # "ClipSrv"
|
46
|
-
|
47
|
-
Service.status('W32Time') => <struct Struct::ServiceStatus ...>
|
48
|
-
|
49
|
-
# Enumerate over all services, inspecting each struct
|
50
|
-
Service.services{ |s|
|
51
|
-
puts s.inspect
|
52
|
-
}
|
53
|
-
|
54
|
-
= Class Methods
|
55
|
-
Service.new(options={})
|
56
|
-
Creates a new service. The +options+ parameter is a hash that can
|
57
|
-
contain any of the following parameters, and their default values:
|
58
|
-
|
59
|
-
KEY DEFAULT
|
60
|
-
* service_name => nil (mandatory)
|
61
|
-
* host => nil
|
62
|
-
* display_name => service_name
|
63
|
-
* desired_access => Service::ALL_ACCESS
|
64
|
-
* service_type => Service::WIN32_OWN_PROCESS|Service::INTERACTIVE_PROCESS
|
65
|
-
* start_type => Service::DEMAND_START
|
66
|
-
* error_control => Service::ERROR_NORMAL
|
67
|
-
* binary_path_name => nil
|
68
|
-
* load_order_group => nil
|
69
|
-
* dependencies => nil
|
70
|
-
* service_start_name => nil
|
71
|
-
* password => nil
|
72
|
-
* description => nil
|
73
|
-
|
74
|
-
Service.configure(options={})
|
75
|
-
Configures an existing service. The +options+ parameter is a hash that can
|
76
|
-
contain any of the following parameters:
|
77
|
-
|
78
|
-
* service_name (mandatory)
|
79
|
-
* host
|
80
|
-
* service_type
|
81
|
-
* start_type
|
82
|
-
* error_control
|
83
|
-
* binary_path_name
|
84
|
-
* load_order_group
|
85
|
-
* dependencies
|
86
|
-
* service_start_name
|
87
|
-
* password (used with service_start_name)
|
88
|
-
* display_name
|
89
|
-
* description
|
90
|
-
|
91
|
-
Service.config_info(service, host=nil)
|
92
|
-
Returns a ServiceConfigInfo struct containing the configuration information
|
93
|
-
about +service+ on +host+, or the local host if no host is specified.
|
94
|
-
|
95
|
-
Service.create
|
96
|
-
Alias for Service.new
|
97
|
-
|
98
|
-
Service.delete(service, host=nil)
|
99
|
-
Deletes the specified +service+ on +host+. If no host is given,
|
100
|
-
then it deletes it on the local machine.
|
101
|
-
|
102
|
-
Service.exists?(service)
|
103
|
-
Returns true if the specified service exists, false otherwise.
|
104
|
-
|
105
|
-
Service.pause(service, host=nil)
|
106
|
-
Pauses the specified +service+ on +host+, or the local machine if
|
107
|
-
no host is provided.
|
108
|
-
|
109
|
-
Service.resume(service, host=nil)
|
110
|
-
Resumes the specified +service+ on +host+, or the local machine if
|
111
|
-
no host is specified.
|
112
|
-
|
113
|
-
Service.services(host=nil, group=nil){ |struct| ... }
|
114
|
-
Enumerates over a list of service types on host, or the local
|
115
|
-
machine if no host is specified, yielding a Win32Service struct for each
|
116
|
-
service.
|
117
|
-
|
118
|
-
If a 'group' is specified, then only those services that belong to
|
119
|
-
that group are enumerated. If an empty string is provided, then only
|
120
|
-
services that do not belong to any group are enumerated. If this parameter
|
121
|
-
is nil, group membership is ignored and all services are enumerated.
|
122
|
-
|
123
|
-
The 'group' option is only available on Windows 2000 or later, and only
|
124
|
-
if compiled with VC++ 7.0 or later, or the .NET SDK. The Win32Service
|
125
|
-
struct contains the following members:
|
126
|
-
|
127
|
-
* service_name
|
128
|
-
* display_name
|
129
|
-
* service_type
|
130
|
-
* current_state
|
131
|
-
* controls_accepted
|
132
|
-
* win32_exit_code
|
133
|
-
* service_specific_exit_code
|
134
|
-
* check_point
|
135
|
-
* wait_hint
|
136
|
-
* binary_path_name
|
137
|
-
* start_type
|
138
|
-
* error_control
|
139
|
-
* load_order_group
|
140
|
-
* tag_id
|
141
|
-
* start_name
|
142
|
-
* dependencies
|
143
|
-
* description
|
144
|
-
* interactive?
|
145
|
-
* pid (Win2k or later)
|
146
|
-
* service_flags (Win2k or later)
|
147
|
-
|
148
|
-
Note that the 'pid' and 'service_flags' members are only available on
|
149
|
-
Windows 2000 or later, and only if built with VC++ 7.0 or later (or the
|
150
|
-
.NET SDK).
|
151
|
-
|
152
|
-
Service.start(service, host=nil, *args)
|
153
|
-
Starts the specified +service+ on +host+, or the local machine if no
|
154
|
-
host is specified. Any +args+ passed here are passed as start parameters
|
155
|
-
to the service.
|
156
|
-
|
157
|
-
Service.status(service)
|
158
|
-
Returns a Win32ServiceStatus struct for the specified service (or
|
159
|
-
raises a Win32::ServiceError if not found). The Win32ServiceStatus
|
160
|
-
struct contains the following members.
|
161
|
-
|
162
|
-
* service_type
|
163
|
-
* current_state
|
164
|
-
* controls_accepted
|
165
|
-
* win32_exit_code
|
166
|
-
* service_specific_exit_code
|
167
|
-
* check_point
|
168
|
-
* wait_hint
|
169
|
-
* interactive?
|
170
|
-
|
171
|
-
Service.stop(service, host=nil)
|
172
|
-
Stops the specified +service+ on +host+, or the local machine if no
|
173
|
-
host is specified.
|
174
|
-
|
175
|
-
= Create and configure options
|
176
|
-
binary_path_name
|
177
|
-
The binary to be used for the service. The path must be the fully
|
178
|
-
qualified path name. A path that contains a space must be quoted so that
|
179
|
-
it is correctly interpreted. The path may also include arguments to the
|
180
|
-
service entry point (typically the 'main' function).
|
181
|
-
|
182
|
-
dependencies
|
183
|
-
Any dependencies the service has in order to run. This can be a string
|
184
|
-
or an array of strings.
|
185
|
-
|
186
|
-
description
|
187
|
-
A text string describing the service.
|
188
|
-
|
189
|
-
display_name
|
190
|
-
The display name to be used by user interface programs to identify the
|
191
|
-
service. The string has a maximum length of 256 characters. Case
|
192
|
-
sensitivity is preserved.
|
193
|
-
|
194
|
-
The default is to set the display name to the same string as the
|
195
|
-
service name.
|
196
|
-
|
197
|
-
error_control
|
198
|
-
The error control for the service. The default is Service::ERROR_NORMAL.
|
199
|
-
|
200
|
-
See the "Error Control Contants" section for available options and their
|
201
|
-
meanings.
|
202
|
-
|
203
|
-
load_order_group
|
204
|
-
The load order group, a string that names the load ordering group of
|
205
|
-
which this service is a member. The default is nil.
|
206
|
-
|
207
|
-
password
|
208
|
-
Sets the passsword to the account name specified in the Service#start_name
|
209
|
-
method. By default, this value is set to nil, which is appropriate if
|
210
|
-
the account has no password or if the service runs in the
|
211
|
-
'LocalService', 'NetworkService', or 'LocalSystem' account.
|
212
|
-
|
213
|
-
Note that passwords are ignored for driver services.
|
214
|
-
|
215
|
-
service_name
|
216
|
-
The service name for the service. This value must be set in order
|
217
|
-
to create a service. The string has a maximum length of 256 characters.
|
218
|
-
|
219
|
-
service_type
|
220
|
-
The service type for the service. The default is
|
221
|
-
Service::WIN32_OWN_PROCESS | Service::INTERACTIVE_PROCESS.
|
222
|
-
|
223
|
-
See the "Service Type Contants" section for available options and their
|
224
|
-
meanings.
|
225
|
-
|
226
|
-
start_name
|
227
|
-
Sets the name of the account under which the service should run.
|
228
|
-
By default the 'LocalSystem' account is used.
|
229
|
-
|
230
|
-
start_type
|
231
|
-
The start type for the service. The default is Service::DEMAND_START.
|
232
|
-
|
233
|
-
See the "Start Type Contants" section for available options and their
|
234
|
-
meanings.
|
235
|
-
|
236
|
-
= Constants
|
237
|
-
|
238
|
-
=== Standard Constants
|
239
|
-
VERSION
|
240
|
-
The current version number of this package, returned as a string.
|
241
|
-
|
242
|
-
=== Desired Access Constants
|
243
|
-
Service::MANAGER_ALL_ACCESS
|
244
|
-
Includes STANDARD_RIGHTS_REQUIRED, in addition to all access rights
|
245
|
-
in the table.
|
246
|
-
|
247
|
-
Service::MANAGER_CREATE_SERVICE
|
248
|
-
Required to call the CreateService function to create a service object
|
249
|
-
and add it to the database.
|
250
|
-
|
251
|
-
Service::MANAGER_CONNECT
|
252
|
-
Required to connect to the service control manager.
|
253
|
-
|
254
|
-
Service::MANAGER_ENUMERATE_SERVICE
|
255
|
-
Required to call the EnumServicesStatus function to list the services
|
256
|
-
that are in the database.
|
257
|
-
|
258
|
-
Service::MANAGER_LOCK
|
259
|
-
Required to call the LockServiceDatabase function to acquire a lock on the
|
260
|
-
database.
|
261
|
-
|
262
|
-
Service::MANAGER_BOOT_CONFIG
|
263
|
-
Required to call the NotifyBootConfigStatus() (internal) function. Not
|
264
|
-
defined with all compilers.
|
265
|
-
|
266
|
-
Service::MANAGER_QUERY_LOCK_STATUS
|
267
|
-
Required to call the QueryServiceLockStatus() (internal) function to
|
268
|
-
retrieve the lock status information for the database.
|
269
|
-
|
270
|
-
=== Service Type Constants
|
271
|
-
Service::FILE_SYSTEM_DRIVER
|
272
|
-
File system driver service.
|
273
|
-
|
274
|
-
Service::KERNEL_DRIVER
|
275
|
-
Driver service.
|
276
|
-
|
277
|
-
Service::WIN32_OWN_PROCESS
|
278
|
-
Service that runs in its own process.
|
279
|
-
|
280
|
-
Service::WIN32_SHARE_PROCESS
|
281
|
-
Service that shares a process with one or more other services.
|
282
|
-
|
283
|
-
Service::INTERACTIVE_PROCESS
|
284
|
-
The service can interact with the desktop. This can only be used if
|
285
|
-
either SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS is
|
286
|
-
specified as well, and the service is running in the context of the
|
287
|
-
LocalSystem account (which is the default for this module, btw).
|
288
|
-
|
289
|
-
=== Start Type Constants
|
290
|
-
Service::AUTO_START
|
291
|
-
A service started automatically by the service control manager during
|
292
|
-
system startup.
|
293
|
-
|
294
|
-
Service::BOOT_START
|
295
|
-
A device driver started by the system loader. This value is valid only
|
296
|
-
for driver services.
|
297
|
-
|
298
|
-
Service::DEMAND_START
|
299
|
-
A service started by the service control manager when a process calls
|
300
|
-
the StartService() function.
|
301
|
-
|
302
|
-
Service::DISABLED
|
303
|
-
A service that cannot be started. Attempts to start the service result
|
304
|
-
in an error.
|
305
|
-
|
306
|
-
Service::SYSTEM_START
|
307
|
-
A device driver started by the IoInitSystem() function. This value is
|
308
|
-
valid only for driver services.
|
309
|
-
|
310
|
-
=== Error Control Constants
|
311
|
-
Service::ERROR_IGNORE
|
312
|
-
The startup program logs the error but continues the startup operation.
|
313
|
-
|
314
|
-
Service::ERROR_NORMAL
|
315
|
-
The startup program logs the error and puts up a message box pop-up but
|
316
|
-
continues the startup operation.
|
317
|
-
|
318
|
-
Service::ERROR_SEVERE
|
319
|
-
The startup program logs the error. If the last-known-good configuration
|
320
|
-
is being started, the startup operation continues. Otherwise, the system
|
321
|
-
is restarted with the last-known-good configuration.
|
322
|
-
|
323
|
-
Service::ERROR_CRITICAL
|
324
|
-
The startup program logs the error, if possible. If the last-known-good
|
325
|
-
configuration is being started the startup operation fails. Otherwise,
|
326
|
-
the system is restarted with the last-known-good configuration.
|
327
|
-
|
328
|
-
= Notes
|
329
|
-
See the MSDN API with regards to CreateService(), etc at http://www.msdn.com.
|
330
|
-
|
331
|
-
Some API ideas taken (or not) from both Python's win32serviceutil.py and
|
332
|
-
Perl's Win32::Service module.
|
333
|
-
|
334
|
-
I don't truly understand how to allow a tag_id in the create_service()
|
335
|
-
method, so for now it's set to NULL automatically. Suggestions welcome.
|
336
|
-
|
337
|
-
= Known Bugs
|
338
|
-
There may be a failure in the test suite if the W32Time dependency is
|
339
|
-
not started.
|
340
|
-
|
341
|
-
If you find any bugs please log them on the github project page at
|
342
|
-
https://github.com/djberg96/win32-service
|
343
|
-
|
344
|
-
= Acknowledgements
|
345
|
-
Many thanks go to Patrick Hurley for providing the fix for the thread
|
346
|
-
blocking issue in the original C code. Thanks also go to Kevin Burge for
|
347
|
-
his patch that solved service responsiveness issues.
|
348
|
-
|
349
|
-
= Future Plans
|
350
|
-
Add Tag_ID support.
|
351
|
-
Add ability to create or modify service failure actions.
|
352
|
-
|
353
|
-
= Copyright
|
354
|
-
(C) 2003-2016, Daniel J. Berger, All Rights Reserved
|
355
|
-
|
356
|
-
= Warranty
|
357
|
-
This package is provided "as is" and without any express or
|
358
|
-
implied warranties, including, without limitation, the implied
|
359
|
-
warranties of merchantability and fitness for a particular purpose.
|
360
|
-
|
361
|
-
== Authors
|
362
|
-
* Daniel J. Berger
|
363
|
-
* Park Heesob
|