-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Image-Factory-Deploy.ps1
693 lines (569 loc) · 23.3 KB
/
Image-Factory-Deploy.ps1
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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
<#PSScriptInfo
.VERSION 23.09.01
.GUID 849ea0c5-1c44-49c1-817e-fd7702b83752
.AUTHOR Mike Galvin Contact: digressive@outlook.com
.COMPANYNAME Mike Galvin
.COPYRIGHT (C) Mike Galvin. All rights reserved.
.TAGS Microsoft Deployment Toolkit MDT Hyper-V Windows OSD Testing
.LICENSEURI https://github.com/Digressive/Image-Factory?tab=MIT-1-ov-file
.PROJECTURI https://gal.vin/utils/image-factory-utility/
.ICONURI
.EXTERNALMODULEDEPENDENCIES
.REQUIREDSCRIPTS
.EXTERNALSCRIPTDEPENDENCIES
.RELEASENOTES
#>
<#
.SYNOPSIS
Image Factory Utility (Deploy) - Automate testing of WIM files and task sequences.
.DESCRIPTION
This script will create Hyper-V virtual machines to test WIM files and Microsoft Deployment
Toolkit task sequences.
Run with -help or no arguments for usage.
#>
## Set up command line switches.
[CmdletBinding()]
Param(
[alias("Deploy")]
$MdtDeployPathUsr,
[alias("TS")]
$TsId,
[alias("VH")]
$VmHost,
[alias("VHD")]
$VhdPathUsr,
[alias("Boot")]
$BootMedia,
[alias("VNic")]
$VmNic,
[alias("L")]
$LogPathUsr,
[alias("LogRotate")]
$LogHistory,
[alias("Subject")]
$MailSubject,
[alias("SendTo")]
$MailTo,
[alias("From")]
$MailFrom,
[alias("Smtp")]
$SmtpServer,
[alias("Port")]
$SmtpPort,
[alias("User")]
$SmtpUser,
[alias("Pwd")]
[ValidateScript({Test-Path -Path $_ -PathType Leaf})]
$SmtpPwd,
[switch]$UseSsl,
[switch]$Remote,
[switch]$VBox,
[switch]$Help,
[switch]$ProgCheck,
[switch]$NoBanner)
If ($NoBanner -eq $False)
{
Write-Host -ForegroundColor Yellow -BackgroundColor Black -Object "
.___ ___________ __ ____ ___ __ .__.__ .__ __
| | _____ ____ \_ _____/____ _____/ |_ ___________ ___.__. | | \_/ |_|__| | |__|/ |_ ___.__.
| |/ \ / ___\ | __) \__ \ _/ ___\ __\/ _ \_ __ < | | | | /\ __\ | | | \ __< | |
| | Y Y \/ /_/ > | \ / __ \\ \___| | ( <_> ) | \/\___ | | | / | | | | |_| || | \___ |
|___|__|_| /\___ / \___ / (____ /\___ >__| \____/|__| / ____| |______/ |__| |__|____/__||__| / ____|
\//_____/ \/ \/ \/ \/ \/
Mike Galvin Version 23.09.01
https://gal.vin See -help for usage -Deploy-
Donate: https://www.paypal.me/digressive
"
}
If ($PSBoundParameters.Values.Count -eq 0 -or $Help)
{
Write-Host -Object " Usage:
From a terminal run: [path\]Image-Factory-Deploy.ps1 -Deploy [path\] -Boot [path\]LiteTouchPE_x64-Deploy.iso
-Vnic [virtual NIC name] -Ts W11-21H2,W10-21H2
This will use Hyper-V VMs on the local machine to build wim files from the task sequences W11-21H2 and W10-21H2.
Use -VH [hostname] to specify a remote Hyper-V server.
Please note that -Boot and -VHD paths will be local to the remote server.
Use -VHD [path\] to configure where to store the VM's VHD, if not the default.
Use -Remote when the Hyper-V server is a remote computer.
Use -VBox if using Virtual Box instead of Hyper-V as the VM platform.
Use -ProgCheck to send notifications (email or webhook) after each Task Sequence is processed.
To output a log: -L [path\].
To remove logs produced by the utility older than X days: -LogRotate [number].
Run with no ASCII banner: -NoBanner
To use the 'email log' function:
Specify the subject line with -Subject ""'[subject line]'"" If you leave this blank a default subject will be used
Make sure to encapsulate it with double & single quotes as per the example for Powershell to read it correctly.
Specify the 'to' address with -SendTo [example@contoso.com]
For multiple address, separate with a comma.
Specify the 'from' address with -From [example@contoso.com]
Specify the SMTP server with -Smtp [smtp server name]
Specify the port to use with the SMTP server with -Port [port number].
If none is specified then the default of 25 will be used.
Specify the user to access SMTP with -User [example@contoso.com]
Specify the password file to use with -Pwd [path\]ps-script-pwd.txt.
Use SSL for SMTP server connection with -UseSsl.
To generate an encrypted password file run the following commands
on the computer and the user that will run the script:
"
Write-Host -Object ' $creds = Get-Credential
$creds.Password | ConvertFrom-SecureString | Set-Content [path\]ps-script-pwd.txt'
}
else {
## If logging is configured, start logging.
## If the log file already exists, clear it.
If ($LogPathUsr)
{
## Clean User entered string
$LogPath = $LogPathUsr.trimend('\')
## Make sure the log directory exists.
If ((Test-Path -Path $LogPath) -eq $False)
{
New-Item $LogPath -ItemType Directory -Force | Out-Null
}
$LogFile = ("Image-Factory-Deploy_{0:yyyy-MM-dd_HH-mm-ss}.log" -f (Get-Date))
$Log = "$LogPath\$LogFile"
If (Test-Path -Path $Log)
{
Clear-Content -Path $Log
}
}
## Function to get date in specific format.
Function Get-DateFormat
{
Get-Date -Format "yyyy-MM-dd HH:mm:ss"
}
## Function for logging.
Function Write-Log($Type, $Evt)
{
If ($Type -eq "Info")
{
If ($LogPathUsr)
{
Add-Content -Path $Log -Encoding ASCII -Value "$(Get-DateFormat) [INFO] $Evt"
}
Write-Host -Object " $(Get-DateFormat) [INFO] $Evt"
}
If ($Type -eq "Succ")
{
If ($LogPathUsr)
{
Add-Content -Path $Log -Encoding ASCII -Value "$(Get-DateFormat) [SUCCESS] $Evt"
}
Write-Host -ForegroundColor Green -Object " $(Get-DateFormat) [SUCCESS] $Evt"
}
If ($Type -eq "Err")
{
If ($LogPathUsr)
{
Add-Content -Path $Log -Encoding ASCII -Value "$(Get-DateFormat) [ERROR] $Evt"
}
Write-Host -ForegroundColor Red -BackgroundColor Black -Object " $(Get-DateFormat) [ERROR] $Evt"
}
If ($Type -eq "Conf")
{
If ($LogPathUsr)
{
Add-Content -Path $Log -Encoding ASCII -Value "$Evt"
}
Write-Host -ForegroundColor Cyan -Object " $Evt"
}
}
## Function for Notifications
Function Notify()
{
## This whole block is for e-mail, if it is configured.
If ($SmtpServer)
{
If (Test-Path -Path $Log)
{
## Default e-mail subject if none is configured.
If ($Null -eq $MailSubject)
{
$MailSubject = "Image Factory Utility Log"
}
## Default Smtp Port if none is configured.
If ($Null -eq $SmtpPort)
{
$SmtpPort = "25"
}
## Setting the contents of the log to be the e-mail body.
$MailBody = Get-Content -Path $Log | Out-String
ForEach ($MailAddress in $MailTo)
{
## If an smtp password is configured, get the username and password together for authentication.
## If an smtp password is not provided then send the e-mail without authentication and obviously no SSL.
If ($SmtpPwd)
{
$SmtpPwdEncrypt = Get-Content $SmtpPwd | ConvertTo-SecureString
$SmtpCreds = New-Object System.Management.Automation.PSCredential -ArgumentList ($SmtpUser, $SmtpPwdEncrypt)
## If -ssl switch is used, send the email with SSL.
## If it isn't then don't use SSL, but still authenticate with the credentials.
If ($UseSsl)
{
Send-MailMessage -To $MailAddress -From $MailFrom -Subject "$MailSubject $Succi/$($TsId.count) TSs Successful" -Body $MailBody -SmtpServer $SmtpServer -Port $SmtpPort -UseSsl -Credential $SmtpCreds
}
else {
Send-MailMessage -To $MailAddress -From $MailFrom -Subject "$MailSubject $Succi/$($TsId.count) TSs Successful" -Body $MailBody -SmtpServer $SmtpServer -Port $SmtpPort -Credential $SmtpCreds
}
}
else {
Send-MailMessage -To $MailAddress -From $MailFrom -Subject "$MailSubject $Succi/$($TsId.count) TSs Successful" -Body $MailBody -SmtpServer $SmtpServer -Port $SmtpPort
}
}
}
else {
Write-Host -ForegroundColor Red -BackgroundColor Black -Object " There's no log file to email."
}
}
## End of Email block
}
## Function for Update Check
Function UpdateCheck()
{
$ScriptVersion = "23.09.01"
$RawSource = "https://raw.githubusercontent.com/Digressive/Image-Factory/master/Image-Factory-Deploy.ps1"
try {
$SourceCheck = Invoke-RestMethod -uri "$RawSource"
$VerCheck = $SourceCheck -split '\n' | Select-String -Pattern ".VERSION $ScriptVersion" -SimpleMatch -CaseSensitive -Quiet
If ($VerCheck -ne $True)
{
Write-Log -Type Conf -Evt "*** There is an update available. ***"
}
}
catch {
}
}
## Config checks for conflicting options, needless options.
If ($Null -eq $MdtDeployPathUsr)
{
Write-Log -Type Err -Evt "The Deployment share is not specified."
Exit
}
If ($Null -eq $TsId)
{
Write-Log -Type Err -Evt "No Task Sequence IDs are specified."
Exit
}
If ($Null -eq $BootMedia)
{
Write-Log -Type Err -Evt "The boot media is not specified."
Exit
}
If ($Null -eq $VmNic)
{
If ($Vbox -eq $false)
{
Write-Log -Type Err -Evt "The virtual NIC is not specified."
Exit
}
}
else {
If ($Vbox -eq $true)
{
Write-Log -Type Info -Evt "This setting is ignored with Virtual Box."
Exit
}
}
If ($Null -ne $Vmhost -AND $Vbox -eq $True)
{
Write-Log -Type Err -Evt "The VM host does not need to be configured with the -VBox switch."
Exit
}
## If not configured set VmHost to local
If ($Null -eq $VmHost)
{
If ($Remote)
{
If ($Vbox)
{
Write-Log -Type Err -Evt "The -Remote switch has no effect with Virtual Box, Virtual Box must be installed locally."
Exit
}
Write-Log -Type Err -Evt "You must specify the remote VM host when the -Remote switch is set."
Exit
}
$VmHost = $Env:ComputerName
If ($Vbox)
{
$VBoxLoc = "C:\Program Files\Oracle\VirtualBox"
If ((Test-Path -Path $VBoxLoc) -eq $False)
{
Write-Log -Type Err -Evt "Virtual Box is not installed on this local machine."
Exit
}
}
else {
## Test for Hyper-V feature installed on local machine.
try {
If ($OSV -eq "6.3.9600")
{
Get-Service vmms -ErrorAction Stop | Out-Null
}
else {
Get-Service vmcompute -ErrorAction Stop | Out-Null
}
}
catch {
Write-Log -Type Err -Evt "Hyper-V is not installed on this local machine."
Exit
}
}
}
else {
If ($Remote -eq $False)
{
Write-Log -Type Err -Evt "You must use the -Remote switch when specifying a remote VM host."
Exit
}
}
## If not configured set VhdPath to the default
If ($Null -eq $VhdPathUsr)
{
If ($Vbox -eq $false)
{
$VhdPathUsr = Get-VMHost -Computer $VmHost | Select-Object VirtualHardDiskPath -ExpandProperty VirtualHardDiskPath
}
else {
Write-Log -Type Err -Evt "You must configure a VHD storage path when using Virtual Box."
Exit
}
}
If ($Null -eq $LogPathUsr -And $SmtpServer)
{
Write-Log -Type Err -Evt "You must specify -L [path\] to use the email log function."
Exit
}
## getting Windows Version info
$OSVMaj = [environment]::OSVersion.Version | Select-Object -expand major
$OSVMin = [environment]::OSVersion.Version | Select-Object -expand minor
$OSVBui = [environment]::OSVersion.Version | Select-Object -expand build
$OSV = "$OSVMaj" + "." + "$OSVMin" + "." + "$OSVBui"
##
## Display the current config and log if configured.
##
Write-Log -Type Conf -Evt "--- Running with the following config ---"
Write-Log -Type Conf -Evt "Utility Version: 23.09.01"
UpdateCheck ## Run Update checker function
Write-Log -Type Conf -Evt "Hostname: $Env:ComputerName."
Write-Log -Type Conf -Evt "Windows Version: $OSV."
If ($MdtDeployPathUsr)
{
Write-Log -Type Conf -Evt "Deploy share: $MdtDeployPathUsr."
}
If ($TsId)
{
Write-Log -Type Conf -Evt "No. of TS ID's: $($TsId.count)."
Write-Log -Type Conf -Evt "TS ID's:"
ForEach ($Id in $TsId)
{
Write-Log -Type Conf -Evt "$Id"
}
}
If ($VmHost)
{
Write-Log -Type Conf -Evt "VM Host:$VmHost."
}
If ($VhdPathUsr)
{
Write-Log -Type Conf -Evt "VHD path: $VhdPathUsr."
}
If ($BootMedia)
{
Write-Log -Type Conf -Evt "Boot media path: $BootMedia."
}
If ($VmNic)
{
Write-Log -Type Conf -Evt "Virtual NIC name: $VmNic."
}
If ($LogPathUsr)
{
Write-Log -Type Conf -Evt "Logs directory: $LogPath."
}
If ($Null -ne $LogHistory)
{
Write-Log -Type Conf -Evt "Logs to keep: $LogHistory days."
}
If ($MailTo)
{
Write-Log -Type Conf -Evt "E-mail log to: $MailTo."
}
If ($MailFrom)
{
Write-Log -Type Conf -Evt "E-mail log from: $MailFrom."
}
If ($MailSubject)
{
Write-Log -Type Conf -Evt "E-mail subject: $MailSubject."
}
If ($SmtpServer)
{
Write-Log -Type Conf -Evt "SMTP server: Configured"
}
If ($SmtpUser)
{
Write-Log -Type Conf -Evt "SMTP Auth: Configured"
}
If ($VBox)
{
Write-Log -Type Conf -Evt "-VBox switch: $VBox."
}
If ($Remote)
{
Write-Log -Type Conf -Evt "-Remote switch: $Remote."
}
Write-Log -Type Conf -Evt "---"
Write-Log -Type Info -Evt "Process started"
##
## Display current config ends here.
##
##Clean the user paths
$VhdPath = $VhdPathUsr.trimend('\')
$MdtDeployPath = $MdtDeployPathUsr.trimend('\')
## For Success/Fail stats
$Succi = 0
## For Progress bar
$i = 0
##
## For each of the Task Sequence ID's configured, run the build process.
##
ForEach ($Id in $TsId)
{
## Progress Bar based on progress through the TS ID's
Write-Progress -Id 0 -Activity "Processing" -Status "Current TSID: $Id" -PercentComplete ($i/$TsId.count*100)
## Test to see if the build environment is dirty from another run, if it is exit the script.
If (Test-Path -Path $MdtDeployPath\Control\CustomSettings-backup.ini)
{
Write-Log -Type Err -Evt "CustomSettings-backup.ini already exists."
Write-Log -Type Err -Evt "The build environment is dirty."
Write-Log -Type Err -Evt "Did the script finish successfully last time it was run?"
Exit
}
Write-Log -Type Info -Evt "Start of Task Sequence ID: $Id"
Write-Log -Type Info -Evt "(TSID:$Id) Backing up current MDT CustomSettings.ini"
## Backup the existing CustomSettings.ini.
Copy-Item $MdtDeployPath\Control\CustomSettings.ini $MdtDeployPath\Control\CustomSettings-backup.ini
Start-Sleep -Seconds 5
Write-Log -Type Info -Evt "(TSID:$Id) Setting MDT CustomSettings.ini for Task Sequence"
## Setup MDT CustomSettings.ini for auto deploy.
Add-Content $MdtDeployPath\Control\CustomSettings.ini ""
Add-Content $MdtDeployPath\Control\CustomSettings.ini ""
Add-Content $MdtDeployPath\Control\CustomSettings.ini "TaskSequenceID=$Id"
Add-Content $MdtDeployPath\Control\CustomSettings.ini "SkipTaskSequence=YES"
Add-Content $MdtDeployPath\Control\CustomSettings.ini "SkipComputerName=YES"
## Set the VM name as build + the date and time.
$VmName = ("$Id`_{0:yyyy-MM-dd_HH-mm-ss}" -f (Get-Date))
Write-Log -Type Info -Evt "(TSID:$Id) Creating VM: $VmName on $VmHost"
Write-Log -Type Info -Evt "(TSID:$Id) Adding VHD: $VhdPath\$VmName.vhdx"
If ($VmNic)
{
Write-Log -Type Info -Evt "(TSID:$Id) Adding Virtual NIC: $VmNic"
}
If ($Vbox -eq $false)
{
## Create the VM with 4GB Dynamic RAM, Gen 1, 127GB VHD, and add the configured vNIC.
try {
New-VM -name $VmName -MemoryStartupBytes 4096MB -BootDevice CD -Generation 1 -NewVHDPath $VhdPath\$VmName.vhdx -NewVHDSizeBytes 130048MB -SwitchName $VmNic -ComputerName $VmHost -ErrorAction Stop | Out-Null
}
catch {
Write-Log -Type Err -Evt "(TSID:$Id) $_"
## Restore CustomSettings.ini from the backup.
Write-Log -Type Info -Evt "(TSID:$Id) Restoring MDT CustomSettings.ini from backup"
Remove-Item $MdtDeployPath\Control\CustomSettings.ini
Move-Item $MdtDeployPath\Control\CustomSettings-backup.ini $MdtDeployPath\Control\CustomSettings.ini
Exit
}
}
else {
& $VBoxLoc\VBoxManage createvm --name $VmName --ostype "Windows10_64" --register
}
Write-Log -Type Info -Evt "(TSID:$Id) Configuring VM Processor Count"
Write-Log -Type Info -Evt "(TSID:$Id) Configuring VM Static Memory"
Write-Log -Type Info -Evt "(TSID:$Id) Configuring VM to boot from $BootMedia"
If ($Vbox -eq $false)
{
## Configure the VM with 2 vCPUs, static RAM and disable checkpoints.
## Set the boot CD to the configured ISO.
## Start the VM
Set-VM $VmName -ProcessorCount 2 -StaticMemory -AutomaticCheckpointsEnabled $false -ComputerName $VmHost
try {
Set-VMDvdDrive -VMName $VmName -ControllerNumber 1 -ControllerLocation 0 -Path $BootMedia -ComputerName $VmHost -ErrorAction Stop
}
catch {
Write-Log -Type Err -Evt "(TSID:$Id) $_"
## If -Remote switch is set, remove the VMs VHD's from the remote server.
## If switch is not set, the VM's VHDs are removed from the local computer.
If ($Remote)
{
$VmBye = Get-VM -Name $VmName -ComputerName $VmHost
$Disks = Get-VHD -VMId $VmBye.Id -ComputerName $VmHost
Write-Log -Type Info -Evt "(TSID:$Id) Deleting $VmName on $VmHost"
Invoke-Command {Remove-Item $using:disks.path -Force} -ComputerName $VmBye.ComputerName
Start-Sleep -Seconds 5
}
else {
$VmLocal = Get-VM -Name $VmName -ComputerName $VmHost
Write-Log -Type Info -Evt "(TSID:$Id) Deleting $VmName on $VmHost"
Remove-Item $VmLocal.HardDrives.Path -Force
}
## Remove Hyper-V VM from remote or local
Remove-VM $VmName -ComputerName $VmHost -Force
## Restore CustomSettings.ini from the backup.
Write-Log -Type Info -Evt "(TSID:$Id) Restoring MDT CustomSettings.ini from backup"
Remove-Item $MdtDeployPath\Control\CustomSettings.ini
Move-Item $MdtDeployPath\Control\CustomSettings-backup.ini $MdtDeployPath\Control\CustomSettings.ini
Exit
}
Write-Log -Type Info -Evt "(TSID:$Id) Starting $VmName on $VmHost"
Start-VM $VmName -ComputerName $VmHost
}
else {
& $VBoxLoc\VBoxManage modifyvm $VmName --cpus 2
& $VBoxLoc\VBoxManage modifyvm $VmName --memory 2048 --vram 128
& $VBoxLoc\VBoxManage modifyvm $VmName --nic1 nat
& $VBoxLoc\VBoxManage createhd --filename $VhdPath\$VmName.vdi --size 130048 --format VDI
& $VBoxLoc\VBoxManage storagectl $VmName --name "SATA Controller" --add sata --controller IntelAhci
& $VBoxLoc\VBoxManage storageattach $VmName --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium $VhdPath\$VmName.vdi
& $VBoxLoc\VBoxManage storagectl $VmName --name "IDE Controller" --add ide --controller PIIX4
& $VBoxLoc\VBoxManage storageattach $VmName --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium $BootMedia
& $VBoxLoc\VBoxManage modifyvm $VmName --boot1 dvd --boot2 disk --boot3 none --boot4 none
Write-Log -Type Info -Evt "(TSID:$Id) Waiting for $VmName to shutdown"
& $VBoxLoc\VBoxHeadless --startvm $VmName
}
If ($Vbox -eq $false)
{
## Wait until the VM is turned off.
Write-Log -Type Info -Evt "(TSID:$Id) Waiting for $VmName to shutdown"
While ((Get-VM -Name $VmName -ComputerName $VmHost).state -ne 'Off') {Start-Sleep -Seconds 5}
## Change VM config to remove boot ISO.
Set-VMDvdDrive -VMName $VmName -ControllerNumber 1 -ControllerLocation 0 -Path $null -ComputerName $VmHost
Set-VM -VMName $VmName -AutomaticStartAction Nothing -AutomaticStopAction Shutdown -ComputerName $VmHost
}
## Restore CustomSettings.ini from the backup.
Write-Log -Type Info -Evt "(TSID:$Id) Restoring MDT CustomSettings.ini from backup"
Remove-Item $MdtDeployPath\Control\CustomSettings.ini
Move-Item $MdtDeployPath\Control\CustomSettings-backup.ini $MdtDeployPath\Control\CustomSettings.ini
Write-Log -Type Info -Evt "End of Task Sequence ID: $Id"
## Increase count for progress bar
$i = $i+1
$Succi = $Succi+1
If ($ProgCheck)
{
Notify
}
}
##
## End of the deploy process for TS's
##
Write-Log -Type Info -Evt "Process finished"
If ($Null -ne $LogHistory)
{
## Cleanup logs.
Write-Log -Type Info -Evt "Deleting logs older than: $LogHistory days"
Get-ChildItem -Path "$LogPath\Image-Factory-Deploy_*" -File | Where-Object CreationTime -lt (Get-Date).AddDays(-$LogHistory) | Remove-Item -Recurse
}
If ($ProgCheck -eq $false)
{
Notify
}
}
## End