aboutsummaryrefslogtreecommitdiff
path: root/src/ext/Iis/ca/scasched.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext/Iis/ca/scasched.cpp')
-rw-r--r--src/ext/Iis/ca/scasched.cpp823
1 files changed, 823 insertions, 0 deletions
diff --git a/src/ext/Iis/ca/scasched.cpp b/src/ext/Iis/ca/scasched.cpp
new file mode 100644
index 00000000..de021275
--- /dev/null
+++ b/src/ext/Iis/ca/scasched.cpp
@@ -0,0 +1,823 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5const int ConfigureIIsCost = 8;
6const int WriteMetabaseChangesCost = 20;
7const int WriteIIS7ConfigChangesCost = 20;
8
9// sql queries
10LPCWSTR vcsUserDeferredQuery = L"SELECT `User`, `Component_`, `Name`, `Domain`, `Password` FROM `User`";
11
12LPCWSTR vcsWebSvcExtQuery = L"SELECT `Component_`, `File`, `Description`, `Group`, `Attributes` FROM `IIsWebServiceExtension`";
13
14LPCWSTR vcsAppPoolQuery = L"SELECT `AppPool`, `Name`, `Component_`, `Attributes`, `User_`, `RecycleMinutes`, `RecycleRequests`, `RecycleTimes`, `VirtualMemory`, `PrivateMemory`, `IdleTimeout`, `QueueLimit`, `CPUMon`, `MaxProc`, `ManagedRuntimeVersion`, `ManagedPipelineMode` FROM `IIsAppPool`";
15
16LPCWSTR vcsComponentAttrQuery = L"SELECT `Component`,`Attributes` FROM `Component`";
17
18LPCWSTR vcsMimeMapQuery = L"SELECT `MimeMap`, `ParentType`, `ParentValue`, `MimeType`, `Extension` FROM `IIsMimeMap`";
19
20LPCWSTR vcsHttpHeaderQuery = L"SELECT `Name`, `ParentType`, `ParentValue`, `Value`, `Attributes` FROM `IIsHttpHeader` ORDER BY `Sequence`";
21
22LPCWSTR vcsWebErrorQuery =
23 L"SELECT `ErrorCode`, `SubCode`, `ParentType`, `ParentValue`, `File`, `URL` "
24 L"FROM `IIsWebError` ORDER BY `ErrorCode`, `SubCode`";
25
26LPCWSTR vcsWebDirPropertiesQuery = L"SELECT `DirProperties`, `Access`, `Authorization`, `AnonymousUser_`, `IIsControlledPassword`, `LogVisits`, `Index`, `DefaultDoc`, `AspDetailedError`, `HttpExpires`, `CacheControlMaxAge`, `CacheControlCustom`, `NoCustomError`, `AccessSSLFlags`, `AuthenticationProviders` "
27 L"FROM `IIsWebDirProperties`";
28
29LPCWSTR vcsSslCertificateQuery = L"SELECT `Certificate`.`StoreName`, `CertificateHash`.`Hash`, `IIsWebSiteCertificates`.`Web_` FROM `Certificate`, `CertificateHash`, `IIsWebSiteCertificates` WHERE `Certificate`.`Certificate`=`CertificateHash`.`Certificate_` AND `CertificateHash`.`Certificate_`=`IIsWebSiteCertificates`.`Certificate_`";
30
31LPCWSTR vcsWebLogQuery = L"SELECT `Log`, `Format` "
32 L"FROM `IIsWebLog`";
33
34LPCWSTR vcsWebApplicationQuery = L"SELECT `Name`, `Isolation`, `AllowSessions`, `SessionTimeout`, "
35 L"`Buffer`, `ParentPaths`, `DefaultScript`, `ScriptTimeout`, "
36 L"`ServerDebugging`, `ClientDebugging`, `AppPool_`, `Application` "
37 L"FROM `IIsWebApplication`";
38
39LPCWSTR vcsWebAppExtensionQuery = L"SELECT `Extension`, `Verbs`, `Executable`, `Attributes`, `Application_` FROM `IIsWebApplicationExtension`";
40
41LPCWSTR vcsWebQuery = L"SELECT `Web`, `Component_`, `Id`, `Description`, `ConnectionTimeout`, `Directory_`, `State`, `Attributes`, `DirProperties_`, `Application_`, "
42 L"`Address`, `IP`, `Port`, `Header`, `Secure`, `Log_` FROM `IIsWebSite`, `IIsWebAddress` "
43 L"WHERE `KeyAddress_`=`Address` ORDER BY `Sequence`";
44
45LPCWSTR vcsWebAddressQuery = L"SELECT `Address`, `Web_`, `IP`, `Port`, `Header`, `Secure` "
46 L"FROM `IIsWebAddress`";
47
48LPCWSTR vcsWebBaseQuery = L"SELECT `Web`, `Id`, `IP`, `Port`, `Header`, `Secure`, `Description` "
49 L"FROM `IIsWebSite`, `IIsWebAddress` "
50 L"WHERE `KeyAddress_`=`Address`";
51
52LPCWSTR vcsWebDirQuery = L"SELECT `Web_`, `WebDir`, `Component_`, `Path`, `DirProperties_`, `Application_` "
53 L"FROM `IIsWebDir`";
54
55LPCWSTR vcsVDirQuery = L"SELECT `Web_`, `VirtualDir`, `Component_`, `Alias`, `Directory_`, `DirProperties_`, `Application_` "
56 L"FROM `IIsWebVirtualDir`";
57
58LPCWSTR vcsFilterQuery = L"SELECT `Web_`, `Name`, `Component_`, `Path`, `Description`, `Flags`, `LoadOrder` FROM `IIsFilter` ORDER BY `Web_`";
59
60LPCWSTR vcsPropertyQuery = L"SELECT `Property`, `Component_`, `Attributes`, `Value` "
61 L"FROM `IIsProperty`";
62
63#define IIS7CONDITION L"VersionNT >= 600"
64#define USEIIS7CONDITION IIS7CONDITION L"AND NOT UseIis6Compatibility"
65
66/********************************************************************
67ConfigureIIs - CUSTOM ACTION ENTRY POINT for installing IIs settings
68
69********************************************************************/
70extern "C" UINT __stdcall ConfigureIIs(
71 __in MSIHANDLE hInstall
72 )
73{
74 //AssertSz(FALSE, "debug ConfigureIIs here");
75 HRESULT hr = S_OK;
76 UINT er = ERROR_SUCCESS;
77 LPWSTR pwzScriptKey = NULL;
78 LPWSTR pwzBackupId = NULL;
79 LPWSTR pwzCustomActionData = NULL; // CustomActionData for ConfigureIIs custom action
80
81 // initialize
82 hr = WcaInitialize(hInstall, "ConfigureIIs");
83 ExitOnFailure(hr, "Failed to initialize");
84
85 // check for the prerequsite tables
86 if (S_OK != WcaTableExists(L"IIsWebSite") && S_OK != WcaTableExists(L"IIsFilter") && S_OK != WcaTableExists(L"IIsProperty") &&
87 S_OK != WcaTableExists(L"IIsWebServiceExtension") && S_OK != WcaTableExists(L"IIsAppPool"))
88 {
89 WcaLog(LOGMSG_VERBOSE, "skipping IIs CustomAction, no IIsWebSite table, no IIsFilter table, no IIsProperty table, no IIsWebServiceExtension, and no IIsAppPool table");
90 ExitFunction1(hr = S_FALSE);
91 }
92
93 // Get a CaScript key
94 hr = WcaCaScriptCreateKey(&pwzScriptKey);
95 ExitOnFailure(hr, "Failed to get encoding key.");
96
97 // Generate a unique string to be used for this product's transaction
98 // This prevents a name collision when doing a major upgrade
99 hr = WcaGetProperty(L"ProductCode", &pwzBackupId);
100 ExitOnFailure(hr, "failed to get ProductCode");
101
102 hr = StrAllocConcat(&pwzBackupId, L"ScaConfigureIIs", 0);
103 ExitOnFailure(hr, "failed to concat ScaConfigureIIs");
104
105 // make sure the operations below are wrapped in a "transaction"
106 // use IIS7 transaction logic even if using Iis6 compat because Backup/Restore don't work with metabase compatibility
107 if (MSICONDITION_TRUE == ::MsiEvaluateConditionW(hInstall, IIS7CONDITION))
108 {
109 hr = ScaIIS7ConfigTransaction(pwzBackupId);
110 MessageExitOnFailure(hr, msierrIISFailedSchedTransaction, "failed to start IIS7 transaction");
111 }
112 else
113 {
114 hr = ScaMetabaseTransaction(pwzBackupId);
115 MessageExitOnFailure(hr, msierrIISFailedSchedTransaction, "failed to start IIS transaction");
116 }
117
118 // Write the CaScript key to the ConfigureIIS custom action data
119 hr = WcaWriteStringToCaData(pwzScriptKey, &pwzCustomActionData);
120 ExitOnFailure(hr, "Failed to add encoding key to CustomActionData.");
121
122 // Wrap vcsUserDeferredQuery to send to deferred CA
123 if (S_OK == WcaTableExists(L"User"))
124 {
125 hr = WcaWrapQuery(vcsUserDeferredQuery, &pwzCustomActionData, efmcColumn3 | efmcColumn4 | efmcColumn5, 0xFFFFFFFF, 0xFFFFFFFF);
126 ExitOnFailure(hr, "Failed to wrap User query");
127 }
128 else
129 {
130 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
131 ExitOnFailure(hr, "Failed to wrap User empty query");
132 }
133
134 // Wrap vcsWebSvcExtQuery to send to deferred CA
135 if (S_OK == WcaTableExists(L"IIsWebServiceExtension"))
136 {
137 hr = WcaWrapQuery(vcsWebSvcExtQuery, &pwzCustomActionData, efmcColumn2 | efmcColumn3 | efmcColumn4, 1, 0xFFFFFFFF);
138 ExitOnFailure(hr, "Failed to wrap IIsWebServiceExtension query");
139 }
140 else
141 {
142 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
143 ExitOnFailure(hr, "Failed to wrap IIsWebServiceExtension empty query");
144 }
145
146 // Wrap vcsAppPoolQuery to send to deferred CA
147 if (S_OK == WcaTableExists(L"IIsAppPool"))
148 {
149 hr = WcaWrapQuery(vcsAppPoolQuery, &pwzCustomActionData, efmcColumn2 | efmcColumn15 | efmcColumn16, 3, 0xFFFFFFFF);
150 ExitOnFailure(hr, "Failed to wrap IIsAppPool query");
151
152 hr = WcaWrapQuery(vcsComponentAttrQuery, &pwzCustomActionData, 0, 0xFFFFFFFF, 0xFFFFFFFF);
153 ExitOnFailure(hr, "Failed to wrap Component query");
154 }
155 else
156 {
157 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
158 ExitOnFailure(hr, "Failed to wrap IIsAppPool empty query");
159 }
160
161 // Wrap vcsMimeMapQuery to send to deferred CA
162 if (S_OK == WcaTableExists(L"IIsMimeMap"))
163 {
164 hr = WcaWrapQuery(vcsMimeMapQuery, &pwzCustomActionData, efmcColumn4 | efmcColumn5, 0xFFFFFFFF, 0xFFFFFFFF);
165 ExitOnFailure(hr, "Failed to wrap IIsMimeMap query");
166 }
167 else
168 {
169 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
170 ExitOnFailure(hr, "Failed to wrap IIsMimeMap empty query");
171 }
172
173 // Wrap vcsHttpHeaderQuery to send to deferred CA
174 if (S_OK == WcaTableExists(L"IIsHttpHeader"))
175 {
176 hr = WcaWrapQuery(vcsHttpHeaderQuery, &pwzCustomActionData, efmcColumn1 | efmcColumn4, 0xFFFFFFFF, 0xFFFFFFFF);
177 ExitOnFailure(hr, "Failed to wrap IIsHttpHeader query");
178 }
179 else
180 {
181 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
182 ExitOnFailure(hr, "Failed to wrap IIsHttpHeader empty query");
183 }
184
185 // Wrap vcsWebErrorQuery to send to deferred CA
186 if (S_OK == WcaTableExists(L"IIsWebError"))
187 {
188 hr = WcaWrapQuery(vcsWebErrorQuery, &pwzCustomActionData, efmcColumn5 | efmcColumn6, 0xFFFFFFFF, 0xFFFFFFFF);
189 ExitOnFailure(hr, "Failed to wrap IIsWebError query");
190 }
191 else
192 {
193 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
194 ExitOnFailure(hr, "Failed to wrap IIsWebError empty query");
195 }
196
197 // Wrap vcsWebDirPropertiesQuery to send to deferred CA
198 if (S_OK == WcaTableExists(L"IIsWebDirProperties"))
199 {
200 hr = WcaWrapQuery(vcsWebDirPropertiesQuery, &pwzCustomActionData, efmcColumn8 | efmcColumn10 | efmcColumn12 | efmcColumn15, 0xFFFFFFFF, 0xFFFFFFFF);
201 ExitOnFailure(hr, "Failed to wrap IIsWebDirProperties query");
202 }
203 else
204 {
205 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
206 ExitOnFailure(hr, "Failed to wrap IIsWebDirProperties empty query");
207 }
208
209 // Wrap vcsSslCertificateQuery to send to deferred CA
210 if (S_OK == WcaTableExists(L"Certificate") && S_OK == WcaTableExists(L"CertificateHash") && S_OK == WcaTableExists(L"IIsWebSiteCertificates"))
211 {
212 hr = WcaWrapQuery(vcsSslCertificateQuery, &pwzCustomActionData, 0, 0xFFFFFFFF, 0xFFFFFFFF);
213 ExitOnFailure(hr, "Failed to wrap SslCertificate query");
214 }
215 else
216 {
217 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
218 ExitOnFailure(hr, "Failed to wrap SslCertificate empty query");
219 }
220
221 // Wrap vcsWebLogQuery to send to deferred CA
222 if (S_OK == WcaTableExists(L"IIsWebLog"))
223 {
224 hr = WcaWrapQuery(vcsWebLogQuery, &pwzCustomActionData, efmcColumn2, 0xFFFFFFFF, 0xFFFFFFFF);
225 ExitOnFailure(hr, "Failed to wrap IIsWebLog query");
226 }
227 else
228 {
229 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
230 ExitOnFailure(hr, "Failed to wrap IIsWebLog empty query");
231 }
232
233 // Wrap vcsWebApplicationQuery to send to deferred CA
234 if (S_OK == WcaTableExists(L"IIsWebApplication"))
235 {
236 hr = WcaWrapQuery(vcsWebApplicationQuery, &pwzCustomActionData, efmcColumn1, 0xFFFFFFFF, 0xFFFFFFFF);
237 ExitOnFailure(hr, "Failed to wrap IIsWebApplication query");
238 }
239 else
240 {
241 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
242 ExitOnFailure(hr, "Failed to wrap IIsWebApplication empty query");
243 }
244
245 // Wrap vcsWebAppExtensionQuery to send to deferred CA
246 if (S_OK == WcaTableExists(L"IIsWebApplicationExtension"))
247 {
248 hr = WcaWrapQuery(vcsWebAppExtensionQuery, &pwzCustomActionData, efmcColumn2 | efmcColumn3, 0xFFFFFFFF, 0xFFFFFFFF);
249 ExitOnFailure(hr, "Failed to wrap IIsWebApplicationExtension query");
250 }
251 else
252 {
253 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
254 ExitOnFailure(hr, "Failed to wrap IIsWebApplicationExtension empty query");
255 }
256
257 // Wrap vcsWebQuery, vcsWebAddressQuery, and vcsWebBaseQuery to send to deferred CA
258 if (S_OK == WcaTableExists(L"IIsWebAddress") && S_OK == WcaTableExists(L"IIsWebSite"))
259 {
260 hr = WcaWrapQuery(vcsWebQuery, &pwzCustomActionData, efmcColumn3 | efmcColumn4 | efmcColumn12 | efmcColumn13 | efmcColumn14, 2, 6);
261 ExitOnFailure(hr, "Failed to wrap IIsWebSite query");
262
263 hr = WcaWrapQuery(vcsWebAddressQuery, &pwzCustomActionData, efmcColumn3 | efmcColumn4 | efmcColumn5, 0xFFFFFFFF, 0xFFFFFFFF);
264 ExitOnFailure(hr, "Failed to wrap IIsWebAddress query");
265
266 hr = WcaWrapQuery(vcsWebBaseQuery, &pwzCustomActionData, efmcColumn2 | efmcColumn3 | efmcColumn4 | efmcColumn5 | efmcColumn7, 0xFFFFFFFF, 0xFFFFFFFF);
267 ExitOnFailure(hr, "Failed to wrap IIsWebBase query");
268 }
269 else
270 {
271 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
272 ExitOnFailure(hr, "Failed to wrap IIsWebSite empty query");
273
274 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
275 ExitOnFailure(hr, "Failed to wrap IIsWebAddress empty query");
276
277 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
278 ExitOnFailure(hr, "Failed to wrap IIsWebBase empty query");
279 }
280
281 // Wrap vcsWebDirQuery to send to deferred CA
282 if (S_OK == WcaTableExists(L"IIsWebDir"))
283 {
284 hr = WcaWrapQuery(vcsWebDirQuery, &pwzCustomActionData, efmcColumn4, 3, 0xFFFFFFFF);
285 ExitOnFailure(hr, "Failed to wrap IIsWebDir query");
286 }
287 else
288 {
289 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
290 ExitOnFailure(hr, "Failed to wrap IIsWebDir empty query");
291 }
292
293 // Wrap vcsVDirQuery to send to deferred CA
294 if (S_OK == WcaTableExists(L"IIsWebVirtualDir"))
295 {
296 hr = WcaWrapQuery(vcsVDirQuery, &pwzCustomActionData, efmcColumn4, 3, 5);
297 ExitOnFailure(hr, "Failed to wrap IIsWebVirtualDir query");
298 }
299 else
300 {
301 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
302 ExitOnFailure(hr, "Failed to wrap IIsWebVirtualDir empty query");
303 }
304
305 // Wrap vcsFilterQuery to send to deferred CA
306 if (S_OK == WcaTableExists(L"IIsFilter"))
307 {
308 hr = WcaWrapQuery(vcsFilterQuery, &pwzCustomActionData, efmcColumn4 | efmcColumn5, 3, 0xFFFFFFFF);
309 ExitOnFailure(hr, "Failed to wrap IIsFilter query");
310 }
311 else
312 {
313 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
314 ExitOnFailure(hr, "Failed to wrap IIsFilter empty query");
315 }
316
317 // Wrap vcsPropertyQuery to send to deferred CA
318 if (S_OK == WcaTableExists(L"IIsProperty"))
319 {
320 hr = WcaWrapQuery(vcsPropertyQuery, &pwzCustomActionData, efmcColumn4, 2, 0xFFFFFFFF);
321 ExitOnFailure(hr, "Failed to wrap IIsProperty query");
322 }
323 else
324 {
325 hr = WcaWrapEmptyQuery(&pwzCustomActionData);
326 ExitOnFailure(hr, "Failed to wrap IIsProperty empty query");
327 }
328
329 if (MSICONDITION_TRUE == ::MsiEvaluateConditionW(hInstall, USEIIS7CONDITION))
330 {
331 // This must remain trace only, CA data may contain password
332 WcaLog(LOGMSG_TRACEONLY, "Custom Action Data for ConfigureIIS7Exec will be: %ls", pwzCustomActionData);
333
334 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ConfigureIIs7Exec"), pwzCustomActionData, ConfigureIIsCost);
335 ExitOnFailure(hr, "Failed to schedule ConfigureIIs7Exec custom action");
336
337 ReleaseNullStr(pwzCustomActionData);
338
339 // Write the CaScript key to the ConfigureIIS custom action data
340 hr = WcaWriteStringToCaData(pwzScriptKey, &pwzCustomActionData);
341 ExitOnFailure(hr, "Failed to add script key to CustomActionData.");
342
343 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WriteIIS7ConfigChanges"), pwzCustomActionData, WriteIIS7ConfigChangesCost);
344 ExitOnFailure(hr, "Failed to schedule WriteMetabaseChanges custom action");
345 }
346 else
347 {
348 // This must remain trace only, CA data may contain password
349 WcaLog(LOGMSG_TRACEONLY, "Custom Action Data for ConfigureIISExec will be: %ls", pwzCustomActionData);
350
351 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ConfigureIIsExec"), pwzCustomActionData, ConfigureIIsCost);
352 ExitOnFailure(hr, "Failed to schedule ConfigureIISExec custom action");
353
354 ReleaseNullStr(pwzCustomActionData);
355
356 // Write the CaScript key to the ConfigureIIS custom action data
357 hr = WcaWriteStringToCaData(pwzScriptKey, &pwzCustomActionData);
358 ExitOnFailure(hr, "Failed to add script key to CustomActionData.");
359
360 hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"WriteMetabaseChanges"), pwzCustomActionData, WriteMetabaseChangesCost);
361 ExitOnFailure(hr, "Failed to schedule WriteMetabaseChanges custom action");
362 }
363
364LExit:
365 ReleaseStr(pwzScriptKey);
366 ReleaseStr(pwzBackupId);
367 ReleaseStr(pwzCustomActionData);
368
369 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
370 return WcaFinalize(er);
371}
372
373/********************************************************************
374ConfigureIIsExec - custom action for installing IIs settings - table
375data will be wrapped and passed in from immediate CA
376ReadIIsTables
377
378********************************************************************/
379extern "C" UINT __stdcall ConfigureIIsExec(
380 __in MSIHANDLE hInstall
381 )
382{
383 //AssertSz(FALSE, "debug ConfigureIIsExec here");
384 HRESULT hr = S_OK;
385 UINT er = ERROR_SUCCESS;
386
387 BOOL fInitializedCom = FALSE;
388 IMSAdminBase* piMetabase = NULL;
389
390 SCA_WEB* pswList = NULL;
391 SCA_WEBDIR* pswdList = NULL;
392 SCA_VDIR* psvdList = NULL;
393 SCA_FILTER* psfList = NULL;
394 SCA_APPPOOL *psapList = NULL;
395 SCA_MIMEMAP* psmmList = NULL;
396 SCA_HTTP_HEADER* pshhList = NULL;
397 SCA_PROPERTY *pspList = NULL;
398 SCA_WEBSVCEXT* psWseList = NULL;
399 SCA_WEB_ERROR* psweList = NULL;
400
401 LPWSTR pwzScriptKey = NULL;
402 LPWSTR pwzCustomActionData = NULL;
403
404 WCA_WRAPQUERY_HANDLE hUserQuery = NULL;
405 WCA_WRAPQUERY_HANDLE hWebBaseQuery = NULL;
406 WCA_WRAPQUERY_HANDLE hWebDirPropQuery = NULL;
407 WCA_WRAPQUERY_HANDLE hSslCertQuery = NULL;
408 WCA_WRAPQUERY_HANDLE hWebLogQuery = NULL;
409 WCA_WRAPQUERY_HANDLE hWebAppQuery = NULL;
410 WCA_WRAPQUERY_HANDLE hWebAppExtQuery = NULL;
411
412 // initialize
413 hr = WcaInitialize(hInstall, "ConfigureIIsExec");
414 ExitOnFailure(hr, "Failed to initialize");
415
416 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
417 ExitOnFailure(hr, "failed to get CustomActionData");
418
419 // Get the CaScript key
420 hr = WcaReadStringFromCaData(&pwzCustomActionData, &pwzScriptKey);
421 ExitOnFailure(hr, "Failed to get CaScript key from custom action data");
422
423 hr = ::CoInitialize(NULL);
424 ExitOnFailure(hr, "failed to initialize COM");
425 fInitializedCom = TRUE;
426
427 // if IIS was uninstalled (thus no IID_IMSAdminBase) allow the
428 // user to still uninstall this package by clicking "Ignore"
429 do
430 {
431 hr = ::CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, (void**)&piMetabase);
432 if (FAILED(hr))
433 {
434 WcaLog(LOGMSG_STANDARD, "failed to get IID_IMSAdminBase Object");
435 er = WcaErrorMessage(msierrIISCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
436 switch (er)
437 {
438 case IDABORT:
439 ExitFunction(); // bail with the error result from the CoCreate to kick off a rollback
440 case IDRETRY:
441 hr = S_FALSE; // hit me, baby, one more time
442 break;
443 case IDIGNORE:
444 __fallthrough;
445 default:
446 WcaLog(LOGMSG_STANDARD, "ignoring absent IIS");
447 // We need to write the empty script to communicate to other deferred CA that there is noting to do.
448 hr = ScaWriteConfigurationScript(pwzScriptKey);
449 ExitOnFailure(hr, "failed to schedule metabase configuration");
450
451 ExitFunction1(hr = S_OK); // pretend everything is okay
452 break;
453 }
454 }
455 } while (S_FALSE == hr);
456
457 // read the msi tables
458 hr = WcaBeginUnwrapQuery(&hUserQuery, &pwzCustomActionData);
459 ExitOnFailure(hr, "Failed to unwrap user query");
460
461 hr = ScaWebSvcExtRead(&psWseList, &pwzCustomActionData);
462 MessageExitOnFailure(hr, msierrIISFailedReadWebSvcExt, "failed while processing WebServiceExtensions");
463
464 hr = ScaAppPoolRead(&psapList, hUserQuery, &pwzCustomActionData);
465 MessageExitOnFailure(hr, msierrIISFailedReadAppPool, "failed while processing WebAppPools");
466
467 // MimeMap, Error and HttpHeader need to be read before the virtual directory and web read
468 hr = ScaMimeMapRead(&psmmList, &pwzCustomActionData);
469 MessageExitOnFailure(hr, msierrIISFailedReadMimeMap, "failed while processing MimeMaps");
470
471 hr = ScaHttpHeaderRead(&pshhList, &pwzCustomActionData);
472 MessageExitOnFailure(hr, msierrIISFailedReadHttpHeader, "failed while processing HttpHeaders");
473
474 hr = ScaWebErrorRead(&psweList, &pwzCustomActionData);
475 MessageExitOnFailure(hr, msierrIISFailedReadWebError, "failed while processing WebErrors");
476
477 hr = WcaBeginUnwrapQuery(&hWebDirPropQuery, &pwzCustomActionData);
478 ExitOnFailure(hr, "Failed to unwrap web dir properties query");
479
480 hr = WcaBeginUnwrapQuery(&hSslCertQuery, &pwzCustomActionData);
481 ExitOnFailure(hr, "Failed to unwrap ssl certificate query");
482
483 hr = WcaBeginUnwrapQuery(&hWebLogQuery, &pwzCustomActionData);
484 ExitOnFailure(hr, "Failed to unwrap web log query");
485
486 hr = WcaBeginUnwrapQuery(&hWebAppQuery, &pwzCustomActionData);
487 ExitOnFailure(hr, "Failed to unwrap web application query");
488
489 hr = WcaBeginUnwrapQuery(&hWebAppExtQuery, &pwzCustomActionData);
490 ExitOnFailure(hr, "Failed to unwrap web application extension query");
491
492 hr = ScaWebsRead(piMetabase, &psmmList, &pswList, &pshhList, &psweList, hUserQuery, hWebDirPropQuery, hSslCertQuery, hWebLogQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData);
493 MessageExitOnFailure(hr, msierrIISFailedReadWebSite, "failed while processing WebSites");
494
495 hr = WcaBeginUnwrapQuery(&hWebBaseQuery, &pwzCustomActionData);
496 ExitOnFailure(hr, "Failed to unwrap web base query");
497
498 hr = ScaWebDirsRead(piMetabase, pswList, hUserQuery, hWebBaseQuery, hWebDirPropQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData, &pswdList);
499 MessageExitOnFailure(hr, msierrIISFailedReadWebDirs, "failed while processing WebDirs");
500
501 hr = ScaVirtualDirsRead(piMetabase, pswList, &psvdList, &psmmList, &pshhList, &psweList, hUserQuery, hWebBaseQuery, hWebDirPropQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData);
502 MessageExitOnFailure(hr, msierrIISFailedReadVDirs, "failed while processing WebVirtualDirs");
503
504 hr = ScaFiltersRead(piMetabase, pswList, hWebBaseQuery, &psfList, &pwzCustomActionData);
505 MessageExitOnFailure(hr, msierrIISFailedReadFilters, "failed while processing WebFilters");
506
507 hr = ScaPropertyRead(&pspList, &pwzCustomActionData);
508 MessageExitOnFailure(hr, msierrIISFailedReadProp, "failed while processing WebProperties");
509
510 // do uninstall actions (order is important!)
511 hr = ScaPropertyUninstall(piMetabase, pspList);
512 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallProp, "failed to uninstall IIS properties");
513
514 hr = ScaFiltersUninstall(piMetabase, psfList);
515 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallFilters, "failed to schedule uninstall of filters");
516
517 hr = ScaVirtualDirsUninstall(piMetabase, psvdList);
518 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallVDirs, "failed to schedule uninstall of virtual directories");
519
520 hr = ScaWebDirsUninstall(piMetabase, pswdList);
521 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallWebDirs, "failed to schedule uninstall of web directories");
522
523 hr = ScaWebsUninstall(piMetabase, pswList);
524 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallWebs, "failed to schedule uninstall of webs");
525
526 hr = ScaAppPoolUninstall(piMetabase, psapList);
527 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallAppPool, "failed to schedule uninstall of AppPools");
528
529
530 // do install actions (order is important!)
531 // ScaWebSvcExtCommit contains both uninstall and install actions.
532 hr = ScaWebSvcExtCommit(piMetabase, psWseList);
533 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebSvcExt, "failed to schedule install/uninstall of WebSvcExt");
534
535 hr = ScaAppPoolInstall(piMetabase, psapList);
536 MessageExitOnFailure(hr, msierrIISFailedSchedInstallAppPool, "failed to schedule install of AppPools");
537
538 hr = ScaWebsInstall(piMetabase, pswList, psapList);
539 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebs, "failed to schedule install of webs");
540
541 hr = ScaWebDirsInstall(piMetabase, pswdList, psapList);
542 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebDirs, "failed to schedule install of web directories");
543
544 hr = ScaVirtualDirsInstall(piMetabase, psvdList, psapList);
545 MessageExitOnFailure(hr, msierrIISFailedSchedInstallVDirs, "failed to schedule install of virtual directories");
546
547 hr = ScaFiltersInstall(piMetabase, psfList);
548 MessageExitOnFailure(hr, msierrIISFailedSchedInstallFilters, "failed to schedule install of filters");
549
550 hr = ScaPropertyInstall(piMetabase, pspList);
551 MessageExitOnFailure(hr, msierrIISFailedSchedInstallProp, "failed to schedule install of properties");
552
553 hr = ScaWriteConfigurationScript(pwzScriptKey);
554 ExitOnFailure(hr, "failed to schedule metabase configuration");
555
556LExit:
557 ReleaseStr(pwzScriptKey);
558 ReleaseStr(pwzCustomActionData);
559
560 WcaFinishUnwrapQuery(hUserQuery);
561 WcaFinishUnwrapQuery(hWebBaseQuery);
562 WcaFinishUnwrapQuery(hWebDirPropQuery);
563 WcaFinishUnwrapQuery(hSslCertQuery);
564 WcaFinishUnwrapQuery(hWebLogQuery);
565 WcaFinishUnwrapQuery(hWebAppQuery);
566 WcaFinishUnwrapQuery(hWebAppExtQuery);
567
568 if (psWseList)
569 {
570 ScaWebSvcExtFreeList(psWseList);
571 }
572
573 if (psfList)
574 {
575 ScaFiltersFreeList(psfList);
576 }
577
578 if (psvdList)
579 {
580 ScaVirtualDirsFreeList(psvdList);
581 }
582
583 if (pswdList)
584 {
585 ScaWebDirsFreeList(pswdList);
586 }
587
588 if (pswList)
589 {
590 ScaWebsFreeList(pswList);
591 }
592
593 if (psmmList)
594 {
595 ScaMimeMapCheckList(psmmList);
596 ScaMimeMapFreeList(psmmList);
597 }
598
599 if (pshhList)
600 {
601 ScaHttpHeaderCheckList(pshhList);
602 ScaHttpHeaderFreeList(pshhList);
603 }
604
605 if (psweList)
606 {
607 ScaWebErrorCheckList(psweList);
608 ScaWebErrorFreeList(psweList);
609 }
610
611 ReleaseObject(piMetabase);
612
613 if (fInitializedCom)
614 {
615 ::CoUninitialize();
616 }
617
618 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
619 return WcaFinalize(er);
620}
621
622
623/********************************************************************
624ConfigureIIs - CUSTOM ACTION ENTRY POINT for installing IIs settings
625
626********************************************************************/
627extern "C" UINT __stdcall ConfigureIIs7Exec(
628 __in MSIHANDLE hInstall
629 )
630{
631 //AssertSz(FALSE, "debug ConfigureIIs7Exec here");
632 HRESULT hr = S_OK;
633 UINT er = ERROR_SUCCESS;
634
635 LPWSTR pwzScriptKey = NULL;
636 LPWSTR pwzCustomActionData = NULL;
637
638 SCA_WEB7* pswList = NULL;
639 SCA_WEBDIR7* pswdList = NULL;
640 SCA_VDIR7* psvdList = NULL;
641 SCA_FILTER* psfList = NULL;
642 SCA_APPPOOL *psapList = NULL;
643 SCA_MIMEMAP* psmmList = NULL;
644 SCA_HTTP_HEADER* pshhList = NULL;
645 SCA_PROPERTY *pspList = NULL;
646 SCA_WEBSVCEXT* psWseList = NULL;
647 SCA_WEB_ERROR* psweList = NULL;
648
649 WCA_WRAPQUERY_HANDLE hUserQuery = NULL;
650 WCA_WRAPQUERY_HANDLE hWebBaseQuery = NULL;
651 WCA_WRAPQUERY_HANDLE hWebDirPropQuery = NULL;
652 WCA_WRAPQUERY_HANDLE hSslCertQuery = NULL;
653 WCA_WRAPQUERY_HANDLE hWebLogQuery = NULL;
654 WCA_WRAPQUERY_HANDLE hWebAppQuery = NULL;
655 WCA_WRAPQUERY_HANDLE hWebAppExtQuery = NULL;
656
657 // initialize
658 hr = WcaInitialize(hInstall, "ConfigureIIs7Exec");
659 ExitOnFailure(hr, "Failed to initialize");
660
661 hr = WcaGetProperty(L"CustomActionData", &pwzCustomActionData);
662 ExitOnFailure(hr, "failed to get CustomActionData");
663
664 // Get the CaScript key
665 hr = WcaReadStringFromCaData(&pwzCustomActionData, &pwzScriptKey);
666 ExitOnFailure(hr, "Failed to get CaScript key from custom action data");
667
668 // read the msi tables
669 hr = WcaBeginUnwrapQuery(&hUserQuery, &pwzCustomActionData);
670 ExitOnFailure(hr, "Failed to unwrap user query");
671
672 hr = ScaWebSvcExtRead(&psWseList, &pwzCustomActionData);
673 MessageExitOnFailure(hr, msierrIISFailedReadWebSvcExt, "failed while processing WebServiceExtensions");
674
675 hr = ScaAppPoolRead(&psapList, hUserQuery, &pwzCustomActionData);
676 MessageExitOnFailure(hr, msierrIISFailedReadAppPool, "failed while processing WebAppPools");
677
678 // MimeMap, Error and HttpHeader need to be read before the virtual directory and web read
679 hr = ScaMimeMapRead(&psmmList, &pwzCustomActionData);
680 MessageExitOnFailure(hr, msierrIISFailedReadMimeMap, "failed while processing MimeMaps");
681
682 hr = ScaHttpHeaderRead(&pshhList, &pwzCustomActionData);
683 MessageExitOnFailure(hr, msierrIISFailedReadHttpHeader, "failed while processing HttpHeaders");
684
685 hr = ScaWebErrorRead(&psweList, &pwzCustomActionData);
686 MessageExitOnFailure(hr, msierrIISFailedReadWebError, "failed while processing WebErrors");
687
688 hr = WcaBeginUnwrapQuery(&hWebDirPropQuery, &pwzCustomActionData);
689 ExitOnFailure(hr, "Failed to unwrap web dir properties query");
690
691 hr = WcaBeginUnwrapQuery(&hSslCertQuery, &pwzCustomActionData);
692 ExitOnFailure(hr, "Failed to unwrap ssl certificate query");
693
694 hr = WcaBeginUnwrapQuery(&hWebLogQuery, &pwzCustomActionData);
695 ExitOnFailure(hr, "Failed to unwrap web log query");
696
697 hr = WcaBeginUnwrapQuery(&hWebAppQuery, &pwzCustomActionData);
698 ExitOnFailure(hr, "Failed to unwrap web application query");
699
700 hr = WcaBeginUnwrapQuery(&hWebAppExtQuery, &pwzCustomActionData);
701 ExitOnFailure(hr, "Failed to unwrap web application extension query");
702
703 hr = ScaWebsRead7(&pswList, &pshhList, &psweList, hUserQuery, hWebDirPropQuery, hSslCertQuery, hWebLogQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData);
704 MessageExitOnFailure(hr, msierrIISFailedReadWebSite, "failed while processing WebSites");
705
706 hr = WcaBeginUnwrapQuery(&hWebBaseQuery, &pwzCustomActionData);
707 ExitOnFailure(hr, "Failed to unwrap web base query");
708
709 hr = ScaWebDirsRead7(pswList, hUserQuery, hWebBaseQuery, hWebDirPropQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData, &pswdList);
710 MessageExitOnFailure(hr, msierrIISFailedReadWebDirs, "failed while processing WebDirs");
711
712 hr = ScaVirtualDirsRead7(pswList, &psvdList, &psmmList, &pshhList, &psweList, hUserQuery, hWebBaseQuery, hWebDirPropQuery, hWebAppQuery, hWebAppExtQuery, &pwzCustomActionData);
713 MessageExitOnFailure(hr, msierrIISFailedReadVDirs, "failed while processing WebVirtualDirs");
714
715 hr = ScaFiltersRead7(pswList, hWebBaseQuery, &psfList, &pwzCustomActionData);
716 MessageExitOnFailure(hr, msierrIISFailedReadFilters, "failed while processing WebFilters");
717
718 hr = ScaPropertyRead(&pspList, &pwzCustomActionData);
719 MessageExitOnFailure(hr, msierrIISFailedReadProp, "failed while processing WebProperties");
720
721 // do uninstall actions (order is important!)
722 hr = ScaPropertyUninstall7(pspList);
723 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallProp, "failed to uninstall IIS properties");
724
725 hr = ScaFiltersUninstall7(psfList);
726 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallFilters, "failed to schedule uninstall of filters");
727
728 hr = ScaVirtualDirsUninstall7(psvdList);
729 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallVDirs, "failed to schedule uninstall of virtual directories");
730
731 hr = ScaWebDirsUninstall7(pswdList);
732 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallWebDirs, "failed to schedule uninstall of web directories");
733
734 hr = ScaWebsUninstall7(pswList);
735 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallWebs, "failed to schedule uninstall of webs");
736
737 hr = ScaAppPoolUninstall7(psapList);
738 MessageExitOnFailure(hr, msierrIISFailedSchedUninstallAppPool, "failed to schedule uninstall of AppPools");
739
740
741 // do install actions (order is important!)
742 // ScaWebSvcExtCommit contains both uninstall and install actions.
743 hr = ScaWebSvcExtCommit7(psWseList);
744 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebSvcExt, "failed to schedule install/uninstall of WebSvcExt");
745
746 hr = ScaAppPoolInstall7(psapList);
747 MessageExitOnFailure(hr, msierrIISFailedSchedInstallAppPool, "failed to schedule install of AppPools");
748
749 hr = ScaWebsInstall7(pswList, psapList);
750 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebs, "failed to schedule install of webs");
751
752 hr = ScaWebDirsInstall7(pswdList, psapList);
753 MessageExitOnFailure(hr, msierrIISFailedSchedInstallWebDirs, "failed to schedule install of web directories");
754
755 hr = ScaVirtualDirsInstall7(psvdList, psapList);
756 MessageExitOnFailure(hr, msierrIISFailedSchedInstallVDirs, "failed to schedule install of virtual directories");
757
758 hr = ScaFiltersInstall7(psfList);
759 MessageExitOnFailure(hr, msierrIISFailedSchedInstallFilters, "failed to schedule install of filters");
760
761 hr = ScaPropertyInstall7(pspList);
762 MessageExitOnFailure(hr, msierrIISFailedSchedInstallProp, "failed to schedule install of properties");
763
764 hr = ScaWriteConfigurationScript(pwzScriptKey);
765 ExitOnFailure(hr, "failed to schedule metabase configuration");
766
767LExit:
768 ReleaseNullStr(pwzScriptKey);
769 ReleaseNullStr(pwzCustomActionData);
770
771 WcaFinishUnwrapQuery(hUserQuery);
772 WcaFinishUnwrapQuery(hWebBaseQuery);
773 WcaFinishUnwrapQuery(hWebDirPropQuery);
774 WcaFinishUnwrapQuery(hSslCertQuery);
775 WcaFinishUnwrapQuery(hWebLogQuery);
776 WcaFinishUnwrapQuery(hWebAppQuery);
777 WcaFinishUnwrapQuery(hWebAppExtQuery);
778
779 if (psWseList)
780 {
781 ScaWebSvcExtFreeList(psWseList);
782 }
783
784 if (psfList)
785 {
786 ScaFiltersFreeList(psfList);
787 }
788
789 if (psvdList)
790 {
791 ScaVirtualDirsFreeList7(psvdList);
792 }
793
794 if (pswdList)
795 {
796 ScaWebDirsFreeList7(pswdList);
797 }
798
799 if (pswList)
800 {
801 ScaWebsFreeList7(pswList);
802 }
803
804 if (psmmList)
805 {
806 ScaMimeMapFreeList(psmmList);
807 }
808
809 if (pshhList)
810 {
811 ScaHttpHeaderCheckList(pshhList);
812 ScaHttpHeaderFreeList(pshhList);
813 }
814
815 if (psweList)
816 {
817 ScaWebErrorCheckList(psweList);
818 ScaWebErrorFreeList(psweList);
819 }
820
821 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
822 return WcaFinalize(er);
823}