summaryrefslogtreecommitdiff
path: root/test/integration/targets/win_service_info/tasks/main.yml
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'