vagrant-uplift 0.2.1902.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/bin/console +13 -0
  3. data/bin/setup +8 -0
  4. data/lib/scripts/vagrant/uplift.vagrant.core/uplift.fix-second-network.ps1 +59 -0
  5. data/lib/scripts/vagrant/uplift.vagrant.dc12/dc.dsc.ps1 +128 -0
  6. data/lib/scripts/vagrant/uplift.vagrant.dc12/dc.replica.dsc.ps1 +117 -0
  7. data/lib/scripts/vagrant/uplift.vagrant.dc12/dc.users.dsc.ps1 +147 -0
  8. data/lib/scripts/vagrant/uplift.vagrant.dc12/tests/dc.dsc.Tests.ps1 +165 -0
  9. data/lib/scripts/vagrant/uplift.vagrant.dcjoin/dc.join.dsc.ps1 +125 -0
  10. data/lib/scripts/vagrant/uplift.vagrant.dcjoin/dc.join.hostname.ps1 +13 -0
  11. data/lib/scripts/vagrant/uplift.vagrant.dcjoin/tests/dc.join.dsc.Tests.ps1 +12 -0
  12. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/shared/sp.helpers.ps1 +155 -0
  13. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/sp2013.dsc.ps1 +248 -0
  14. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/sp2013.post_setup.dsc.ps1 +117 -0
  15. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/sp2016.dsc.ps1 +246 -0
  16. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/sp2016.farm-only.dsc.ps1 +281 -0
  17. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/sp2016.info.ps1 +36 -0
  18. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/sp2016.post_setup.dsc.ps1 +125 -0
  19. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/sp2016.pre_setup1.dsc.ps1 +28 -0
  20. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/sp2016.pre_setup2.dsc.ps1 +75 -0
  21. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/tests/sp2013.dsc.wfe.Tests.ps1 +68 -0
  22. data/lib/scripts/vagrant/uplift.vagrant.sharepoint/tests/sp2016.dsc.wfe.Tests.ps1 +68 -0
  23. data/lib/scripts/vagrant/uplift.vagrant.sql12/sql.complete.dsc.ps1 +186 -0
  24. data/lib/scripts/vagrant/uplift.vagrant.sql12/sql.dsc.ps1 +66 -0
  25. data/lib/scripts/vagrant/uplift.vagrant.sql12/sql.optimize.dsc.ps1 +50 -0
  26. data/lib/scripts/vagrant/uplift.vagrant.sql12/sql.prepare.dsc.ps1 +60 -0
  27. data/lib/scripts/vagrant/uplift.vagrant.sql12/tests/sql.dsc.Tests.ps1 +23 -0
  28. data/lib/scripts/vagrant/uplift.vagrant.sql12/tests/sql12.dsc.Tests.ps1 +45 -0
  29. data/lib/scripts/vagrant/uplift.vagrant.sql12/tests/sql16.dsc.Tests.ps1 +22 -0
  30. data/lib/scripts/vagrant/uplift.vagrant.visual_studio13/tests/vs13.dsc.Tests.ps1 +61 -0
  31. data/lib/scripts/vagrant/uplift.vagrant.visual_studio13/vs13.dsc.post_deploy.ps1 +32 -0
  32. data/lib/scripts/vagrant/uplift.vagrant.visual_studio13/vs13.dsc.ps1 +69 -0
  33. data/lib/scripts/vagrant/uplift.vagrant.visual_studio17/tests/vs17.dsc.Tests.ps1 +61 -0
  34. data/lib/scripts/vagrant/uplift.vagrant.visual_studio17/vs17.dsc.post_deploy.ps1 +34 -0
  35. data/lib/scripts/vagrant/uplift.vagrant.visual_studio17/vs17.dsc.ps1 +134 -0
  36. data/lib/scripts/vagrant/uplift.vagrant.win12soe/soe.dsc.ps1 +115 -0
  37. data/lib/scripts/vagrant/uplift.vagrant.win12soe/soe.shortcuts.dsc.ps1 +41 -0
  38. data/lib/scripts/vagrant/uplift.vagrant.win12soe/tests/soe.dsc.modules.Tests.ps1 +71 -0
  39. data/lib/scripts/vagrant/uplift.vagrant.win12soe/tests/soe.dsc.os.Tests.ps1 +89 -0
  40. data/lib/vagrant-uplift.rb +8 -0
  41. data/lib/vagrant-uplift/config_builder.rb +819 -0
  42. data/lib/vagrant-uplift/log.rb +146 -0
  43. data/lib/vagrant-uplift/plugin-vagrant-uplift-checkpoint.rb +41 -0
  44. data/lib/vagrant-uplift/plugin.rb +16 -0
  45. data/lib/vagrant-uplift/version.rb +10 -0
  46. metadata +131 -0
@@ -0,0 +1,281 @@
1
+ # fail on errors and include uplift helpers
2
+ $ErrorActionPreference = "Stop"
3
+
4
+ Import-Module Uplift.Core
5
+
6
+ # include shared helpers from uplift.vagrant.sharepoint handler
7
+ . "c:/windows/temp/uplift.vagrant.sharepoint/shared/sp.helpers.ps1"
8
+
9
+ Write-UpliftMessage "Creating new SharePoint farm..."
10
+ Write-UpliftEnv
11
+
12
+ $spSqlServerName = Get-UpliftEnvVariable "UPLF_SP_FARM_SQL_SERVER_HOST_NAME"
13
+ $spSqlDbPrefix = Get-UpliftEnvVariable "UPLF_SP_FARM_SQL_DB_PREFIX"
14
+
15
+ $spPassPhrase = Get-UpliftEnvVariable "UPLF_SP_FARM_PASSPHRASE"
16
+
17
+ $spSetupUserName = Get-UpliftEnvVariable "UPLF_SP_SETUP_USER_NAME"
18
+ $spSetupUserPassword = Get-UpliftEnvVariable "UPLF_SP_SETUP_USER_PASSWORD"
19
+
20
+ function Get-SharePointLocalFarm() {
21
+
22
+ $result = $null
23
+
24
+ try {
25
+
26
+ if ($null -eq (Get-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue))
27
+ {
28
+ Add-PSSnapin Microsoft.SharePoint.PowerShell
29
+ }
30
+
31
+ $result = Get-SPFarm -ErrorAction SilentlyContinue
32
+ Write-UpliftMessage "Local farm: $result"
33
+
34
+ } catch {
35
+ Write-UpliftMessage "Error while detecting local SharePoint install"
36
+ Write-UpliftMessage $_
37
+
38
+ $result = $null
39
+ }
40
+
41
+ return $result
42
+ }
43
+
44
+ Write-UpliftMessage "Detecting existing SharePoint farm install..."
45
+ $hasFarm = ($null -ne (Get-SharePointLocalFarm))
46
+
47
+ Write-UpliftMessage " - hasFarm: $hasFarm"
48
+
49
+ if($hasFarm -eq $False) {
50
+ Write-UpliftMessage "No existing farm found, cleaning up SQL server dbs: $spSqlServerName $spSqlDbPrefix"
51
+ # prepare SQL server for SharePoint deployment
52
+ Initialize-UpSPSqlServer $spSqlServerName $spSqlDbPrefix
53
+
54
+ } else {
55
+ Write-UpliftMessage "Detected local SharePoint farm. No SQL server clean up is needed"
56
+ }
57
+
58
+ # deploy SharePoint
59
+ Configuration Install_SharePointFarm
60
+ {
61
+ Import-DscResource -ModuleName PSDesiredStateConfiguration
62
+ Import-DscResource -ModuleName SharePointDsc
63
+
64
+ Node localhost {
65
+
66
+ $setupUserName = $Node.SetupUserName
67
+ $setupUserPassword = $Node.SetupUserPassword
68
+ $spPassPhrase = $Node.PassPhrase
69
+
70
+ $secureSetupUserPassword = ConvertTo-SecureString $setupUserPassword -AsPlainText -Force
71
+ $setupUserCreds = New-Object System.Management.Automation.PSCredential($setupUserName, $secureSetupUserPassword)
72
+
73
+ $securePassPhrase = ConvertTo-SecureString $spPassPhrase -AsPlainText -Force
74
+ $passPhraseCreds = New-Object System.Management.Automation.PSCredential($setupUserName, $securePassPhrase)
75
+
76
+ $SPSetupAccount = $setupUserCreds
77
+ $SPFarmAccount = $setupUserCreds
78
+
79
+ $SPServicePoolManagedAccount = $setupUserCreds
80
+ $SPWebPoolManagedAccount = $setupUserCreds
81
+
82
+ $SPServiceAppPoolName = "SharePoint Service Applications"
83
+
84
+ LocalConfigurationManager
85
+ {
86
+ RebootNodeIfNeeded = $false
87
+ }
88
+
89
+ # ensuring that required services are up before running SharePoint farm creation
90
+ # that allows to fail eraly in case of spoiled images
91
+ Service W3SVC
92
+ {
93
+ Name = "W3SVC"
94
+ StartupType = "Automatic"
95
+ State = "Running"
96
+ }
97
+
98
+ Service IISADMIN
99
+ {
100
+ DependsOn = "[Service]W3SVC"
101
+
102
+ Name = "IISADMIN"
103
+ StartupType = "Automatic"
104
+ State = "Running"
105
+ }
106
+
107
+ # initial farm creation
108
+ SPFarm CreateSPFarm
109
+ {
110
+ DependsOn = "[Service]IISADMIN"
111
+
112
+ Ensure = "Present"
113
+ ServerRole = "SingleServerFarm"
114
+ DatabaseServer = $spSqlServerName
115
+ FarmConfigDatabaseName = ($spSqlDbPrefix + "_Config")
116
+ Passphrase = $passPhraseCreds
117
+ FarmAccount = $SPFarmAccount
118
+ PsDscRunAsCredential = $SPSetupAccount
119
+ AdminContentDatabaseName = ($spSqlDbPrefix + "_AdminContent")
120
+ RunCentralAdmin = $true
121
+ #DependsOn = "[SPInstall]InstallSharePoint"
122
+ }
123
+
124
+ # accounts
125
+ SPManagedAccount ServicePoolManagedAccount
126
+ {
127
+ AccountName = $SPServicePoolManagedAccount.UserName
128
+ Account = $SPServicePoolManagedAccount
129
+ PsDscRunAsCredential = $SPSetupAccount
130
+ DependsOn = "[SPFarm]CreateSPFarm"
131
+ }
132
+ SPManagedAccount WebPoolManagedAccount
133
+ {
134
+ AccountName = $SPWebPoolManagedAccount.UserName
135
+ Account = $SPWebPoolManagedAccount
136
+ PsDscRunAsCredential = $SPSetupAccount
137
+ DependsOn = "[SPFarm]CreateSPFarm"
138
+ }
139
+
140
+ # default apps
141
+ SPUsageApplication UsageApplication
142
+ {
143
+ Name = "Usage Service Application"
144
+ DatabaseName = ($spSqlDbPrefix + "_SP_Usage" )
145
+ UsageLogCutTime = 5
146
+ UsageLogLocation = "C:\UsageLogs"
147
+ UsageLogMaxFileSizeKB = 1024
148
+ PsDscRunAsCredential = $SPSetupAccount
149
+ DependsOn = "[SPFarm]CreateSPFarm"
150
+ }
151
+
152
+ SPStateServiceApp StateServiceApp
153
+ {
154
+ Name = "State Service Application"
155
+ DatabaseName = ($spSqlDbPrefix + "_SP_State")
156
+ PsDscRunAsCredential = $SPSetupAccount
157
+ DependsOn = "[SPFarm]CreateSPFarm"
158
+ }
159
+
160
+ SPDistributedCacheService EnableDistributedCache
161
+ {
162
+ Name = "AppFabricCachingService"
163
+ Ensure = "Present"
164
+ CacheSizeInMB = 1024
165
+ ServiceAccount = $SPServicePoolManagedAccount.UserName
166
+ PsDscRunAsCredential = $SPSetupAccount
167
+ CreateFirewallRules = $true
168
+ DependsOn = @('[SPFarm]CreateSPFarm','[SPManagedAccount]ServicePoolManagedAccount')
169
+ }
170
+
171
+ # default services
172
+ SPServiceInstance ClaimsToWindowsTokenServiceInstance
173
+ {
174
+ Name = "Claims to Windows Token Service"
175
+ Ensure = "Present"
176
+ PsDscRunAsCredential = $SPSetupAccount
177
+ DependsOn = "[SPFarm]CreateSPFarm"
178
+ }
179
+
180
+ SPServiceInstance SecureStoreServiceInstance
181
+ {
182
+ Name = "Secure Store Service"
183
+ Ensure = "Present"
184
+ PsDscRunAsCredential = $SPSetupAccount
185
+ DependsOn = "[SPFarm]CreateSPFarm"
186
+ }
187
+
188
+ SPServiceInstance ManagedMetadataServiceInstance
189
+ {
190
+ Name = "Managed Metadata Web Service"
191
+ Ensure = "Present"
192
+ PsDscRunAsCredential = $SPSetupAccount
193
+ DependsOn = "[SPFarm]CreateSPFarm"
194
+ }
195
+
196
+ SPServiceInstance BCSServiceInstance
197
+ {
198
+ Name = "Business Data Connectivity Service"
199
+ Ensure = "Present"
200
+ PsDscRunAsCredential = $SPSetupAccount
201
+ DependsOn = "[SPFarm]CreateSPFarm"
202
+ }
203
+
204
+ SPServiceInstance SearchServiceInstance
205
+ {
206
+ Name = "SharePoint Server Search"
207
+ Ensure = "Present"
208
+ PsDscRunAsCredential = $SPSetupAccount
209
+ DependsOn = "[SPFarm]CreateSPFarm"
210
+ }
211
+
212
+ # # service applications
213
+ # SPServiceAppPool MainServiceAppPool
214
+ # {
215
+ # Name = $SPServiceAppPoolName
216
+ # ServiceAccount = $SPServicePoolManagedAccount.UserName
217
+ # PsDscRunAsCredential = $SPSetupAccount
218
+ # DependsOn = "[SPFarm]CreateSPFarm"
219
+ # }
220
+
221
+ # SPSecureStoreServiceApp SecureStoreServiceApp
222
+ # {
223
+ # Name = "Secure Store Service Application"
224
+ # ApplicationPool = $SPServiceAppPoolName
225
+ # AuditingEnabled = $true
226
+ # AuditlogMaxSize = 30
227
+ # DatabaseName = ($spSqlDbPrefix + "_SP_SecureStore")
228
+ # PsDscRunAsCredential = $SPSetupAccount
229
+ # DependsOn = "[SPServiceAppPool]MainServiceAppPool"
230
+ # }
231
+
232
+ # SPManagedMetaDataServiceApp ManagedMetadataServiceApp
233
+ # {
234
+ # Name = "Managed Metadata Service Application"
235
+ # PsDscRunAsCredential = $SPSetupAccount
236
+ # ApplicationPool = $SPServiceAppPoolName
237
+ # DatabaseName = ($spSqlDbPrefix + "_SP_MMS")
238
+ # DependsOn = "[SPServiceAppPool]MainServiceAppPool"
239
+ # }
240
+
241
+ # SPBCSServiceApp BCSServiceApp
242
+ # {
243
+ # Name = "BCS Service Application"
244
+ # DatabaseServer = $spSqlServerName
245
+ # ApplicationPool = $SPServiceAppPoolName
246
+ # DatabaseName = ($spSqlDbPrefix + "_SP_BCS")
247
+ # PsDscRunAsCredential = $SPSetupAccount
248
+ # DependsOn = @('[SPServiceAppPool]MainServiceAppPool', '[SPSecureStoreServiceApp]SecureStoreServiceApp')
249
+ # }
250
+
251
+ # SPSearchServiceApp SearchServiceApp
252
+ # {
253
+ # Name = "Search Service Application"
254
+ # DatabaseName = ($spSqlDbPrefix + "_SP_Search")
255
+ # ApplicationPool = $SPServiceAppPoolName
256
+ # PsDscRunAsCredential = $SPSetupAccount
257
+ # DependsOn = "[SPServiceAppPool]MainServiceAppPool"
258
+ # }
259
+ }
260
+ }
261
+
262
+ $config = @{
263
+ AllNodes = @(
264
+ @{
265
+ NodeName = 'localhost'
266
+
267
+ PSDscAllowDomainUser = $true
268
+ PSDscAllowPlainTextPassword = $true
269
+
270
+ SetupUserName = $spSetupUserName
271
+ SetupUserPassword = $spSetupUserPassword
272
+
273
+ PassPhrase = $spPassPhrase
274
+ }
275
+ )
276
+ }
277
+
278
+ $configuration = Get-Command Install_SharePointFarm
279
+ Start-UpliftDSCConfiguration $configuration $config
280
+
281
+ exit 0
@@ -0,0 +1,36 @@
1
+ # fail on errors and include uplift helpers
2
+ $ErrorActionPreference = "Stop"
3
+
4
+ function Get-SharePoint2016Edittion($productId) {
5
+
6
+ # https://social.technet.microsoft.com/wiki/contents/articles/40031.sharepoint-2016-detect-the-installed-edition-with-powershell.aspx
7
+
8
+ switch ($productId)
9
+ {
10
+ "5DB351B8-C548-4C3C-BFD1-82308C9A519B" { return "SharePoint 2016 Trail Edition" }
11
+ "4F593424-7178-467A-B612-D02D85C56940" { return "SharePoint 2016 Standard Edition" }
12
+ "716578D2-2029-4FF2-8053-637391A7E683" { return "SharePoint 2016 Enterprise Edition" }
13
+ "435d4d60-f4cf-421d-abc8-129e4b57f7a" { return "n/a" }
14
+ }
15
+
16
+ return $productId
17
+ }
18
+
19
+ Write-Host "Loading SharePoint snapin"
20
+ ASNP Microsoft.SharePoint.Powershell
21
+
22
+ Write-Host "Fetching local farm..."
23
+ $farm = Get-SPFarm
24
+
25
+ Write-Host "Farm version (config db version):"
26
+ $farm.BuildVersion
27
+
28
+ Write-Host "Farm products:"
29
+ $farm.Products | % { Write-Host ($_.Guid + " (" + (Get-SharePoint2016Edittion $_.Guid) + ")") }
30
+
31
+ Write-Host "SharePoint-related products:"
32
+ Get-SPProduct -Local `
33
+ | Sort-Object -Property ProductName `
34
+ | % { Write-Host $_.ProductName }
35
+
36
+ exit 0
@@ -0,0 +1,125 @@
1
+ # fail on errors and include uplift helpers
2
+ $ErrorActionPreference = "Stop"
3
+
4
+ Import-Module Uplift.Core
5
+
6
+ # include shared helpers from uplift.vagrant.sharepoint handler
7
+ . "c:/windows/temp/uplift.vagrant.sharepoint/shared/sp.helpers.ps1"
8
+
9
+ Write-UpliftMessage "Running SharePoint post-setup tuning..."
10
+ Write-UpliftEnv
11
+
12
+ Configuration Install_SharePointFarmTuning
13
+ {
14
+ Import-DscResource -ModuleName PSDesiredStateConfiguration
15
+ Import-DscResource -ModuleName SharePointDsc
16
+ Import-DscResource -ModuleName xWebAdministration
17
+
18
+ Node localhost {
19
+
20
+ LocalConfigurationManager
21
+ {
22
+ RebootNodeIfNeeded = $false
23
+ }
24
+
25
+ Service SharePointAdministration {
26
+ Ensure = "Present"
27
+ Name = "SPAdminV4"
28
+ StartupType = "Automatic"
29
+ State = "Running"
30
+ }
31
+
32
+ Service SharePointSearchHostController {
33
+ Ensure = "Present"
34
+ Name = "SPSearchHostController"
35
+ StartupType = "Automatic"
36
+ State = "Running"
37
+ }
38
+
39
+ Service SharePointServerSearch15 {
40
+ Ensure = "Present"
41
+ Name = "OSearch16"
42
+ StartupType = "Automatic"
43
+ State = "Running"
44
+ }
45
+
46
+ Service SharePointTimerService {
47
+ Ensure = "Present"
48
+ Name = "SPTimerV4"
49
+ StartupType = "Automatic"
50
+ State = "Running"
51
+ }
52
+
53
+ Service SharePointTracingService {
54
+ Ensure = "Present"
55
+ Name = "SPTraceV4"
56
+ StartupType = "Automatic"
57
+ State = "Running"
58
+ }
59
+
60
+ Service SharePointUserCodeHost {
61
+ Ensure = "Present"
62
+ Name = "SPUserCodeV4"
63
+ StartupType = "Automatic"
64
+ State = "Running"
65
+ }
66
+
67
+ xWebsite SharePointCentralAdministrationv4 {
68
+ Ensure = "Present"
69
+ Name="SharePoint Central Administration v4"
70
+ State = "Started"
71
+ }
72
+
73
+ xWebsite SharePointWebServices {
74
+ Ensure = "Present"
75
+ Name="SharePoint Web Services"
76
+ State = "Started"
77
+ }
78
+
79
+ xWebAppPool SecurityTokenServiceApplicationPool {
80
+ Ensure = "Present"
81
+ Name="SecurityTokenServiceApplicationPool"
82
+ State = "Started"
83
+ }
84
+
85
+ xWebAppPool SharePointCentralAdministrationv4AppPool {
86
+ Ensure = "Present"
87
+ Name="SharePoint Central Administration v4"
88
+ State = "Started"
89
+ }
90
+
91
+ xWebAppPool SharePointWebServicesRootAppPool {
92
+ Ensure = "Present"
93
+ Name="SharePoint Web Services Root"
94
+ State = "Started"
95
+ }
96
+ }
97
+ }
98
+
99
+ $config = @{
100
+ AllNodes = @(
101
+ @{
102
+ NodeName = 'localhost'
103
+
104
+ PSDscAllowDomainUser = $true
105
+ PSDscAllowPlainTextPassword = $true
106
+ }
107
+ )
108
+ }
109
+
110
+ # applying updates if any
111
+ $cmd_text = 'psconfig.exe -cmd upgrade -inplace b2b -force -cmd applicationcontent -install -cmd installfeatures'
112
+
113
+ Write-UpliftMessage "Running updates: $cmd_text"
114
+ cd "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\BIN"
115
+ ./psconfig.exe -cmd upgrade -inplace b2b -force -cmd applicationcontent -install -cmd installfeatures
116
+ Confirm-UpliftExitCode $LASTEXITCODE "Cannot execute farm updates: $cmd_text"
117
+
118
+ Write-UpliftMessage "Ensuring IIS services are up"
119
+ Invoke-UpliftIISReset
120
+
121
+ # ensuring other services are up
122
+ $configuration = Get-Command Install_SharePointFarmTuning
123
+ Start-UpliftDSCConfiguration $configuration $config
124
+
125
+ exit 0
@@ -0,0 +1,28 @@
1
+ # fail on errors and include uplift helpers
2
+ $ErrorActionPreference = "Stop"
3
+
4
+ Import-Module Uplift.Core
5
+
6
+ # include shared helpers from uplift.vagrant.sharepoint handler
7
+ . "c:/windows/temp/uplift.vagrant.sharepoint/shared/sp.helpers.ps1"
8
+
9
+ Write-UpliftMessage "Running SharePoint pre-setup1 tuning..."
10
+ Write-UpliftEnv
11
+
12
+ # all this happens due to spoiled IIS installation after sysprep
13
+ # prereq/sp bin get IIS configured, but sysprep kills it
14
+ # we make some patches, and then uninstall IIS, and then run reboot
15
+ # once done, we bring Web-Server feature back and all works well
16
+
17
+ # patch IIS config
18
+ # https://forums.iis.net/t/1160389.aspx
19
+ Write-UpliftMessage "Fixing IIS config after sysprep"
20
+ Write-UpliftMessage " - details: https://forums.iis.net/t/1160389.aspx"
21
+
22
+ Repair-UpliftIISApplicationHostFile
23
+
24
+ # uninstall web server feature
25
+ Write-UpliftMessage "Uninstalling Web-Server feature"
26
+ Uninstall-WindowsFeature Web-Server | Out-Null
27
+
28
+ exit 0