blob: d393322236a48ba4251bab51375894f6b0eff5a7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
---
- name: ensure test directory exists
win_file:
path: '{{ test_path }}'
state: directory
- name: download test binary for services
win_get_url:
url: '{{ service_url }}'
dest: '{{ test_path }}\SleepService.exe'
- name: create test service
win_service:
name: '{{ item }}'
path: '"{{ test_path }}\SleepService.exe"'
state: stopped
loop: '{{ service_names }}'
notify: remove test service
- name: test we can get info for all services
win_service_info:
register: all_actual
check_mode: yes # tests that this will run in check mode
- name: assert test we can get info for all services
assert:
that:
- not all_actual is changed
- all_actual.exists
- all_actual.services | length > 0
- name: test info on a missing service
win_service_info:
name: ansible_service_info_missing
register: missing_service
- name: assert test info on a missing service
assert:
that:
- not missing_service is changed
- not missing_service.exists
- name: test info on a single service
win_service_info:
name: '{{ service_name1 }}'
register: specific_service
- name: assert test info on single service
assert:
that:
- not specific_service is changed
- specific_service.exists
- specific_service.services | length == 1
- specific_service.services[0].checkpoint == 0
- specific_service.services[0].controls_accepted == []
- specific_service.services[0].dependencies == []
- specific_service.services[0].dependency_of == []
- specific_service.services[0].description == None
- specific_service.services[0].desktop_interact == False
- specific_service.services[0].display_name == service_name1
- specific_service.services[0].error_control == 'normal'
- specific_service.services[0].failure_actions == []
- specific_service.services[0].failure_actions_on_non_crash_failure == False
- specific_service.services[0].failure_command == None
- specific_service.services[0].failure_reboot_msg == None
- specific_service.services[0].failure_reset_period_sec == 0
- specific_service.services[0].launch_protection == 'none'
- specific_service.services[0].load_order_group == ""
- specific_service.services[0].name == service_name1
- specific_service.services[0].path == '"' ~ test_path + '\\SleepService.exe"'
- specific_service.services[0].pre_shutdown_timeout_ms is defined # Looks like the default for New-Service differs per OS version
- specific_service.services[0].preferred_node == None
- specific_service.services[0].process_id == 0
- specific_service.services[0].required_privileges == []
- specific_service.services[0].service_exit_code == 0
- specific_service.services[0].service_flags == []
- specific_service.services[0].service_type == 'win32_own_process'
- specific_service.services[0].sid_info == 'none'
- specific_service.services[0].start_mode == 'auto'
- specific_service.services[0].state == 'stopped'
- specific_service.services[0].triggers == []
- specific_service.services[0].username == 'NT AUTHORITY\SYSTEM'
- specific_service.services[0].wait_hint_ms == 0
- specific_service.services[0].win32_exit_code == 1077
- name: test info on services matching wildcard
win_service_info:
name: ansible_service_info_t* # should match service_name 1 and 2, but not 3
register: wildcard_service
- name: assert test info on services matching wildcard
assert:
that:
- not wildcard_service is changed
- wildcard_service.exists
- wildcard_service.services | length == 2
- wildcard_service.services[0].name == service_name1
- wildcard_service.services[1].name == service_name2
- name: modify service1 to depend on service 2
win_service:
name: '{{ service_name1 }}'
state: stopped
dependencies:
- '{{ service_name2 }}'
- name: edit basic settings for service 2
win_service:
dependencies:
- '{{ service_name3 }}'
description: Service description
display_name: Ansible Service Display Name
name: '{{ service_name2 }}'
state: stopped
# TODO: move this back into the above once win_service supports them
- name: edit complex settings for service 2
win_command: sc.exe {{ item.action }} {{ service_name2 }} {{ item.args }}
with_items:
- action: config
args: type= share type= interact error= ignore group= "My group" start= delayed-auto
- action: failure
args: reset= 86400 reboot= "Reboot msg" command= "Command line" actions= run/500/run/600/restart/700/reboot/800
- action: failureflag
args: 1
- action: sidtype
args: unrestricted
- action: privs
args: SeBackupPrivilege/SeRestorePrivilege
- action: triggerinfo
args: start/namedpipe/abc start/namedpipe/def start/custom/0e0682e2-9951-4e6d-a36a-a0047e616f28/11223344/aabbccdd start/strcustom/c2961e88-c1f4-4d97-b581-219c852e1c7d/11223344/aabbccdd start/portopen/1234;tcp;imagepath;servicename
- name: get info of advanced service using display name
win_service_info:
name: Ansible Service Display Name
register: adv_service
- name: assert get info of advanced service using display_name
assert:
that:
- not adv_service is changed
- adv_service.exists
- adv_service.services | length == 1
- adv_service.services[0].dependencies == [service_name3]
- adv_service.services[0].dependency_of == [service_name1]
- adv_service.services[0].description == 'Service description'
- adv_service.services[0].desktop_interact == True
- adv_service.services[0].error_control == 'ignore'
- adv_service.services[0].failure_actions | length == 4
- adv_service.services[0].failure_actions[0].delay_ms == 500
- adv_service.services[0].failure_actions[0].type == 'run_command'
- adv_service.services[0].failure_actions[1].delay_ms == 600
- adv_service.services[0].failure_actions[1].type == 'run_command'
- adv_service.services[0].failure_actions[2].delay_ms == 700
- adv_service.services[0].failure_actions[2].type == 'restart'
- adv_service.services[0].failure_actions[3].delay_ms == 800
- adv_service.services[0].failure_actions[3].type == 'reboot'
- adv_service.services[0].failure_actions_on_non_crash_failure == True
- adv_service.services[0].failure_command == 'Command line'
- adv_service.services[0].failure_reboot_msg == 'Reboot msg'
- adv_service.services[0].failure_reset_period_sec == 86400
- adv_service.services[0].load_order_group == 'My group'
- adv_service.services[0].required_privileges == ['SeBackupPrivilege', 'SeRestorePrivilege']
- adv_service.services[0].service_type == 'win32_share_process'
- adv_service.services[0].sid_info == 'unrestricted'
- adv_service.services[0].start_mode == 'delayed'
- adv_service.services[0].triggers | length == 5
- adv_service.services[0].triggers[0].action == 'start_service'
- adv_service.services[0].triggers[0].data_items | length == 1
- adv_service.services[0].triggers[0].data_items[0].data == 'abc'
- adv_service.services[0].triggers[0].data_items[0].type == 'string'
- adv_service.services[0].triggers[0].sub_type == 'named_pipe_event'
- adv_service.services[0].triggers[0].sub_type_guid == '1f81d131-3fac-4537-9e0c-7e7b0c2f4b55'
- adv_service.services[0].triggers[0].type == 'network_endpoint'
- adv_service.services[0].triggers[1].action == 'start_service'
- adv_service.services[0].triggers[1].data_items | length == 1
- adv_service.services[0].triggers[1].data_items[0].data == 'def'
- adv_service.services[0].triggers[1].data_items[0].type == 'string'
- adv_service.services[0].triggers[1].sub_type == 'named_pipe_event'
- adv_service.services[0].triggers[1].sub_type_guid == '1f81d131-3fac-4537-9e0c-7e7b0c2f4b55'
- adv_service.services[0].triggers[1].type == 'network_endpoint'
- adv_service.services[0].triggers[2].action == 'start_service'
- adv_service.services[0].triggers[2].data_items | length == 2
- adv_service.services[0].triggers[2].data_items[0].data == 'ESIzRA=='
- adv_service.services[0].triggers[2].data_items[0].type == 'binary'
- adv_service.services[0].triggers[2].data_items[1].data == 'qrvM3Q=='
- adv_service.services[0].triggers[2].data_items[1].type == 'binary'
- adv_service.services[0].triggers[2].sub_type == 'custom'
- adv_service.services[0].triggers[2].sub_type_guid == '0e0682e2-9951-4e6d-a36a-a0047e616f28'
- adv_service.services[0].triggers[2].type == 'custom'
- adv_service.services[0].triggers[3].action == 'start_service'
- adv_service.services[0].triggers[3].data_items | length == 2
- adv_service.services[0].triggers[3].data_items[0].data == '11223344'
- adv_service.services[0].triggers[3].data_items[0].type == 'string'
- adv_service.services[0].triggers[3].data_items[1].data == 'aabbccdd'
- adv_service.services[0].triggers[3].data_items[1].type == 'string'
- adv_service.services[0].triggers[3].sub_type == 'custom'
- adv_service.services[0].triggers[3].sub_type_guid == 'c2961e88-c1f4-4d97-b581-219c852e1c7d'
- adv_service.services[0].triggers[3].type == 'custom'
- adv_service.services[0].triggers[4].action == 'start_service'
- adv_service.services[0].triggers[4].data_items | length == 1
- adv_service.services[0].triggers[4].data_items[0].data == ['1234', 'tcp', 'imagepath', 'servicename']
- adv_service.services[0].triggers[4].data_items[0].type == 'string'
- adv_service.services[0].triggers[4].sub_type == 'firewall_port_open'
- adv_service.services[0].triggers[4].sub_type_guid == 'b7569e07-8421-4ee0-ad10-86915afdad09'
- adv_service.services[0].triggers[4].type == 'firewall_port_event'
|