Compare commits

..

92 Commits

Author SHA1 Message Date
rbalsleyMSFT f4360b34d9 Merge pull request #113 from rbalsleyMSFT/2410.1
2412.1
2024-12-20 12:42:44 -08:00
rbalsleyMSFT 0ed0cf4aa2 Changed ApplyFFU version to 2412.1 2024-12-19 17:09:06 -08:00
rbalsleyMSFT 61fc2198c9 Updated docs and update parameter descriptions in BuildFFUVM.ps1 2024-12-19 16:52:52 -08:00
rbalsleyMSFT f45f5a899b Added parameter description for ExportConfigFile 2024-12-19 15:47:10 -08:00
rbalsleyMSFT 37f6dce344 Changes
- Updated parameter definition block to be alphabetized (not to be confused by the param block, which is not alphabetized)
- Added $PEDriversFolder script variable to the param block (for some reason it was missing)
- Added ConfigFile and ExportConfigFile parameters to support json config files
- Changed Version to 2412.1
- Modified vhdxCacheItem class to include $LogicalSectorSizeBytes
- Added new function Get-Parameters to help with new config and export config file functionality
- Fixed Get-MicrosoftDrivers function to not require the HTMLFILE COM object, which isn't available in Windows 11. It seems to be installed with Office, which is what was allowing downloads to work and masked the issue.
- Added long path support to prevent issues with oscdimg creating the Apps.iso.
- Fixed an issue where the $PEDriversFolder variable wasn't being used (instead $FFUDevelopment\PEDrivers was used)
- Created a new function New-FFUFileName - this works in conjunction with the new $CustomFFUNameTemplate. The function was needed to support both scenarios where $InstallApps is either $true or $false.
- Added new function Export-ConfigFile. When passing -ExportConfigFile 'Path\To\ConfigFile.json' the script will generate a parameter dump of all of the configured parameters
- Added driver folder validation to throw an error if spaces are detected in the folder name of the drivers folder (e.g. C:\FFUDevelopment\Drivers\Dell 3190). This is due to an issue with Dell drivers and their inability to handle paths with spaces consistently.
- Added back the Windows Security Platform update which grabs it from the web instead of the Microsoft update catalog
- Fixed an issue where the Drivers folder was being completely deleted instead of its sub-folders
- Removed the Requires -PSEdition Desktop. The script works with both Desktop and Core, so pwsh 7 is fine.
- Created a new config folder to hold config files. A new sample_default.json file is provided to show what the format looks like.
- You can now set the computername in the unattend.xml file whereever you want. Prior it required that the computername was the first component element.
2024-12-18 16:10:35 -08:00
rbalsleyMSFT 10624787fe Fix ODT
- Refactored the Get-ODTURL function to fix recent download issues. Also added some better error handling
- Moved the odtsetup.exe download to the FFUDevelopment folder and will clean it up after office has downloaded
2024-12-10 15:39:49 -08:00
rbalsleyMSFT d7a697d68d Misc Fixes
- Added Get-Childprocesses function to return child processes of parent process
- Added a new -Wait boolean parameter to Invoke-Process function. This is to control whether Invoke-Process should wait in order to track stdout and stderr output. This is needed for processes that may hang, waiting for user input and there isn't a way to bypass (some Intel drivers provided by Dell leave dialog windows even when running silently)
-Invoke-Process now returns process information (returns $cmd). This allows for process tracking when calling the function.
- Since Invoke-Process now returns the process information, also needed to add Out-Null to the majority of the Invoke-Process references to prevent Invoke-Process from writing to the terminal
- Refactored a lot of the Get-DellDrivers function due to inconsistencies with how driver extraction behaves between client and server devices. For client, /s /e seemed to work fine, but for server it would only extract the driver installer content and other dell related files, rather than the driver files themselves. We have since switched to using /s /drivers= which will extract the driver content. Not all drivers support /drivers= and may output some information to the terminal that looks like help documentation. If a driver doesn't support /drivers, the script falls back to using /s /e to do the extraction. If this doesn't work for you, you can always provide your own drivers that you manually download from Dell's website.
- Updated Malicious Software Removal Tool (MSRT) code to handle Windows Server
2024-12-09 14:59:02 -08:00
rbalsleyMSFT 97954f59c3 - Added Windows 2025/24H2 mapping 2024-12-03 16:55:40 -08:00
rbalsleyMSFT 3b23e9f420 Merge pull request #91 from JonasKloseBW:Better-Windows-Server-Patch-Search
2410.1 Find better Windows Server patches
2024-12-03 16:14:17 -08:00
rbalsleyMSFT 94712ecbfc Merge remote-tracking branch 'origin/2410.1' into pr/JonasKloseBW/91 2024-12-03 16:13:26 -08:00
Mike Kelly a2c2b69026 Update USBImagingToolCreator.ps1 2024-12-03 13:43:36 -08:00
rbalsleyMSFT 6abc6f9d1a Fixed an error with removing the office variable when capturing the FFU 2024-12-02 18:34:58 -08:00
rbalsleyMSFT db0fbfaaf4 Refactor CaptureFFU.ps1 to use $WindowsVersion and $WindowsRelease for improved clarity and consistency in FFU naming 2024-12-02 18:11:38 -08:00
JonasKloseBW a59210c559 Update CaptureFFU.ps1
- Add $CustomFFUNameTemplate support in Update CaptureFFU.ps1
2024-12-02 18:11:38 -08:00
JonasKloseBW add11b0037 Update BuildFFUVM.ps1
- Add $CustomFFUNameTemplate and the required code into BuildFFUVM.ps1
2024-12-02 18:11:38 -08:00
HedgeComp c26034a89c Update unattend_arm64.xml 2024-12-02 10:40:18 -08:00
HedgeComp 9287464eb8 Update unattend_x64.xml 2024-12-02 10:40:18 -08:00
HedgeComp 1c103b2db7 Rename SampleUnattend_64.xml to SampleUnattend_x64.xml 2024-12-02 10:40:18 -08:00
HedgeComp ed6a5fc7f1 Create SampleUnattend_64.xml
Sample for Unattend File.
2024-12-02 10:40:18 -08:00
rbalsleyMSFT 768efc8cf7 Merge pull request #99 from rbalsleyMSFT/revert-98-revert-89-2410.1-Allow-VHDX-caching
Revert "Revert "2410.1 Allow vhdx caching""
2024-11-28 17:41:06 -08:00
rbalsleyMSFT 39a9bc9022 Revert "Revert "2410.1 Allow vhdx caching"" 2024-11-28 17:40:22 -08:00
rbalsleyMSFT f90b7b3c9b Merge pull request #98 from rbalsleyMSFT/revert-89-2410.1-Allow-VHDX-caching
Revert "2410.1 Allow vhdx caching"
2024-11-28 17:38:07 -08:00
rbalsleyMSFT 802a225c3e Revert "2410.1 Allow vhdx caching" 2024-11-28 17:36:00 -08:00
rbalsleyMSFT 74370db5de Merge pull request #89 from JonasKloseBW/2410.1-Allow-VHDX-caching 2024-11-27 13:18:20 -08:00
rbalsleyMSFT db788c3c30 - If not passing an ISO, hardcoded WindowsVersion of 22H2 for Windows 10 or 24H2 for Windows 11 since the ESD media only provides those two versions. Not doing this allowed for unnecessary VHDX creation since it checks the WindowsVersion via the json file. This also fixes an issue where CUs could be searched for that didn’t exist, but the media would still download
- Added some additional logging entries
- Removed verbose output of the Optimize-Volume command
- Fixed an issue where not passing an ISO caused the script to fail
- Cleaned up the KBPath folder at the end of the run
- Changed some minor formatting items
2024-11-27 13:13:29 -08:00
JonasKloseBW eae619e7e8 Update BuildFFUVM.ps1
- Fix update search for Windows Server 2025 release
2024-11-04 18:23:57 +01:00
JonasKloseBW 0f3380e91e Merge pull request #19 from rbalsleyMSFT/2410.1
- $WindowsVersion set to 24h2, can override by using -WindowsVersion …
2024-10-12 03:30:16 +02:00
JonasKloseBW 7c80486d88 Merge pull request #18 from rbalsleyMSFT/2410.1
- $WindowsVersion set to 24h2, can override by using -WindowsVersion …
2024-10-12 03:22:31 +02:00
rbalsleyMSFT 1f65198803 - $WindowsVersion set to 24h2, can override by using -WindowsVersion 23H2 if you want the old behavior
- Removed the "Downloading information GUID" messages when downloading content from the Microsoft Update Catalog while -verbose was specified in the command line
- In Get-KBLink, made a change to just grab the first result returned instead of the entire results page. This removes the need to use a break statement in Save-KB when downloading updates. This fixed an issue with the new 24H2 Checkpoint Cumulative Updates in Win11 and Server 2025.
- Changed Windows MSRT search string for x64 and x86. This was mainly to get x64 to the top of the search results. x86 won't actually download since the code isn't in place for content from the MU Catalog to download x86 content (no idea if anyone actually builds x86 FFUs for Win10 - I hope not)
2024-10-09 16:17:11 -07:00
JonasKloseBW 0f18b7bd80 Merge branch '2410.1' into Better-Windows-Server-Patch-Search 2024-10-05 02:36:47 +02:00
JonasKloseBW b89f4a3b6b Merge branch '2410.1' into 2410.1-Allow-VHDX-caching 2024-10-05 02:11:50 +02:00
rbalsleyMSFT 658d2d7af4 - Added server skus to validateset for $WindowsSKU
- Added new variable $installationType which uses $WindowsRelease to determine Server or Client. If $installationType is Server, $WindowsRelease version is used to set $WindowsVersion to the appropriate version (1607, 1809, 21H2)
- Fixed an issue where the recovery partition wouldn't be created on server OSes due to winre.wim being hidden. Never saw this on client OSes even though it also was hidden IIRC.
- Removed verbosity for Optimize-Volume as it was outputting when -verbose was not specified.
- Modified some search strings for .NET CUs when installing on Server OS
- Included SSU for Windows Server 2016 as it's mandatory
- Added some error checking for Server 2019 and 2022 CU installations when CU fails due to lack of SSU. If you run into this error, you're using old media and should use the latest. Always use the latest ISO if you can.
2024-10-04 14:58:21 -07:00
JonasKloseBW f09c404f65 Update BuildFFUVM.ps1
- Find better results for Windows Server 2019 .NET Framework updates
2024-10-03 03:47:33 +02:00
JonasKloseBW fbe8eca263 Update Search Strings: Update BuildFFUVM.ps1
- Update search strings for Windows / .NET Framework updates to get more consistent and reliable results
2024-10-02 15:05:41 +02:00
JonasKloseBW 923e8b070d Merge branch '2410.1' into 2410.1-Allow-VHDX-caching 2024-10-01 03:46:04 +02:00
rbalsleyMSFT e6e53e566f Merge pull request #84 from JonasKloseBW/2410.1
Add support for Windows Server in 2410.1 branch
2024-09-30 10:31:42 -07:00
JonasKloseBW f144f1d71c Update CaptureFFU.ps1
- Add support for Server Core in SKU name
2024-09-30 16:52:15 +02:00
JonasKloseBW 3694e1a6e4 Update BuildFFUVM.ps1
- Add parameter $AllowVHDXCaching
- Adds the ability to cache VHDX files together with their configuration
- This should roughly cut the build time in half as long as there are no new patches released since the last cached VHDX file
2024-09-30 15:44:40 +02:00
JonasKloseBW d45b6dc8dc Update BuildFFUVM.ps1
- improve Optimize-FFUCaptureDrive
- use the drive letter that the Windows partition gets after mounting the vhdx file
2024-09-30 14:14:33 +02:00
JonasKloseBW 5194133a78 Update BuildFFUVM.ps1
- Add help for parameter AppsScriptVariables
2024-09-27 18:34:41 +02:00
JonasKloseBW 6e5d634af6 Update BuildFFUVM.ps1
- Bypass VMSwitchIPAddress to VMHostAddress check on systems with a configured NAT setup
2024-09-27 02:15:25 +02:00
JonasKloseBW 32d5ff3b47 Merge branch 'rbalsleyMSFT:2410.1' into 2410.1 2024-09-26 20:11:45 +02:00
JonasKloseBW 5545554d7e Update BuildFFUVM.ps1
- Fix accidental variable accumulation in InstallAppsandSysprep.cmd
2024-09-26 20:08:47 +02:00
JonasKloseBW 6a0faa958e Update InstallAppsandSysprep.cmd 2/2
- Add parameter $AppsScriptVariablesvariable
- Allow value based behavior changes during the app install phase in InstallAppsandSysprep.cmd
2024-09-26 17:16:22 +02:00
JonasKloseBW 15c0478710 Update BuildFFUVM.ps1 1/2
- Add parameter $AppsScriptVariablesvariable
- Allow value based behavior changes during the app install phase in InstallAppsandSysprep.cmd
2024-09-26 17:15:17 +02:00
rbalsleyMSFT bab9804022 Merge pull request #79 from zehadialam/2410.1
Include Latest Windows Malicious Software Removal Tool
2024-09-24 14:28:23 -07:00
Zehadi Alam c93c417dba Removed Get-MSRTUrl function and use Microsoft Update Catalog to retrieve latest MSRT 2024-09-23 23:42:09 -04:00
JonasKloseBW 2fe91de000 Merge branch 'main' into 2410.1 2024-09-23 11:27:52 +02:00
JonasKloseBW 412e3a078c Update CaptureFFU.ps1
- Add Windows Server support like in BuildFFUVM.ps1
2024-09-23 04:37:09 +02:00
JonasKloseBW b6dda55a82 Update BuildFFUVM.ps1
- Updated the .NET Framework download code
- Download the appropriate .NET Framework for Windows Server
2024-09-23 04:29:04 +02:00
JonasKloseBW b8bda93e8d Update BuildFFUVM.ps1
- Updated MU Catalog search
- Search now includes searching for Windows Server updates

Has been verified to work for Windows Server 2022 and Windows Server 2025 only.
2024-09-23 04:26:30 +02:00
JonasKloseBW ac485f9c87 Update BuildFFUVM.ps1
- Update Get-WindowsVersionInfo
- Server Standard is now called 'Srv_Std'
- Server Datacenter is now called 'Srv_Dtc'
- 17763 is matched as Windows Server 2019
- 20348 is matched as Windows Server 2022
- 26100 is matched as Windows Server 2025
- other versions are matched as $DisplayVersion as a fallback

Please remember to update the Windows Server version of 2025 in case it changes until release.
2024-09-23 04:16:57 +02:00
JonasKloseBW 4b33627d19 Update BuildFFUVM.ps1
- Fix bug in New-OSPartition
- CompactOS is now avoided on Windows Server
2024-09-23 04:11:15 +02:00
JonasKloseBW af28624e2d Update BuildFFUVM.ps1
- Update Get-Index to support processing Windows Server images
2024-09-23 04:08:01 +02:00
JonasKloseBW 3457aedf5d Update BuildFFUVM.ps1
- Add support for searching Windows Server SKUs in images in Get-WimIndex
2024-09-23 04:04:13 +02:00
JonasKloseBW 5acac4ba5b Update BuildFFUVM.ps1
- Update Get-LatestWindowsKB to support searching for Windows Server updates
- Improve the HTML regex to return a more precise match by using the $WindowsRelease variable for lookbehind based searching
2024-09-23 04:02:28 +02:00
JonasKloseBW 0b151f9054 Update BuildFFUVM.ps1
- Throw error when trying to download Windows Server as it's not possible
2024-09-23 03:55:37 +02:00
JonasKloseBW cafc45dbba Update BuildFFUVM.ps1
- Add Dell driver download support for Windows Server 2016, 2022 and fall back to 2022 drivers for other Server versions.
2024-09-23 03:53:45 +02:00
JonasKloseBW e3cbcab6b2 Update BuildFFUVM.ps1
- Add script parameters to allow Windows Server image creation
2024-09-23 03:41:40 +02:00
Zehadi Alam ec7e9a546c Adjust pattern for URL scraping 2024-09-17 21:08:09 -04:00
Zehadi Alam 7a2aab3204 Adjust install command for MSRT 2024-09-17 20:36:22 -04:00
rbalsleyMSFT 5dcdd2c36f Clean up the Get-MicrosoftDrivers old code and version change 2024-09-17 14:03:43 -07:00
rbalsleyMSFT fb0a630bfd Merge pull request #78 from rbalsleyMSFT/main
Merge main to 2410.1
2024-09-17 13:58:55 -07:00
rbalsleyMSFT 47cd0deb03 Merge pull request #77 from rbalsleyMSFT/2409.2
2409.2
2024-09-17 13:54:58 -07:00
rbalsleyMSFT 378941cd5c Two fixes
- Fixed an issue with UWP apps downloaded via Winget weren't being fully installed. Added /StubPackageOption:installfull to the dism command
- Fixed an issue with Surface Drivers not downloading
2024-09-17 13:50:16 -07:00
Zehadi Alam 1da28024cc Add support for updating latest Windows Malicious Software Removal Tool 2024-09-15 00:41:04 -04:00
rbalsleyMSFT 480e6a62b6 Merge pull request #74 from w0/main
Added support for relative paths
2024-09-12 12:32:22 -07:00
w0 807456de86 removed unused variable. more format. 2024-09-12 13:57:58 -05:00
w0 c8ef42ab21 Update USBImagingToolCreator.ps1
added support for relative paths. formatted script and removed functions from inside if statement.
2024-09-12 13:54:58 -05:00
rbalsleyMSFT 60d147c71d Update README.md 2024-09-10 11:45:44 -07:00
rbalsleyMSFT cd36150ddc Merge pull request #71 from rbalsleyMSFT/2409.1
2409.1
2024-09-10 11:44:49 -07:00
rbalsleyMSFT 198a544dbb update change log 2024-09-10 11:44:12 -07:00
rbalsleyMSFT 40616776eb - Added VMHostIPAddress and VMSwitchName validation to validate the IP address matches the VMSwitchName 2024-09-07 09:53:14 -07:00
rbalsleyMSFT 20c9cf8ab3 Merge pull request #65 from HedgeComp/Time-to-Complete-Hours
Time To Complete Shows Hours if Needed
2024-09-06 11:26:54 -07:00
rbalsleyMSFT 17558f86aa Merge pull request #64 from HedgeComp/OneDrive-Silent
Silently Install Onedrive
2024-09-06 11:26:15 -07:00
rbalsleyMSFT 7408dbb435 Merge branch '2409.1' of https://github.com/rbalsleyMSFT/FFU into 2409.1 2024-09-06 11:24:21 -07:00
rbalsleyMSFT 9c1fc59af9 - Added new variables for the PPKG, Unattend, Autopilot, and PEDrivers validation 2024-09-06 11:24:16 -07:00
HedgeComp 31c785b5da Update BuildFFUVM.ps1
Add Hours to Total Time to complete only if greater than 1 hour
2024-09-06 13:00:09 -04:00
HedgeComp 5b93135ebb Update BuildFFUVM.ps1
Add Silent switch install to Onedrivesetup.exe
2024-09-06 12:57:36 -04:00
rbalsleyMSFT 5f4cf0c66e Merge pull request #60 from zehadialam/2409.1
Fix for Missing Windows Boot Manager Entry
2024-09-06 09:34:11 -07:00
Zehadi Alam ddbf2b0339 Use bcdedit to set Windows Boot Manager and default Windows boot loader to be first in the display order of UEFI firmware 2024-09-05 17:57:35 -04:00
rbalsleyMSFT e62d481405 - Remove ValidateScript on InstallDrivers and break it out in a validation block so -Make and -Model can be specified anywhere in the command line
- Check for Prefixes.txt file and copy to the USB drive if it exists
- Perform better validation for PPKG, Unattend, Autopilot json, and drivers
- Comment out the Windows Security Platform update as the file has been removed from the MU Catalog.
2024-09-04 17:05:06 -07:00
rbalsleyMSFT 6c07ac8595 Merge branch '2409.1' of https://github.com/rbalsleyMSFT/FFU into 2409.1 2024-09-04 13:20:38 -07:00
rbalsleyMSFT 7d74feec0c - Fix an issue with removal of Defender/OneDrive/Edge after FFU is complete
- Migrate Winget downloads to use Export-WingetPackage cmdlet as per issue Known Issue: Winget downloads fail on Non-English OS #50
- Add better logging when unable to find HDD when applying FFU
2024-09-04 13:20:35 -07:00
rbalsleyMSFT 6b2a4bcb27 Merge pull request #51 from HedgeComp/2408.2
Allow Preview CU update
2024-09-04 13:08:58 -07:00
rbalsleyMSFT 6da9ece0d8 Merge pull request #54 from w0/main
use ValidateSet for WindowsSKU
2024-08-15 18:59:01 -07:00
w0 dc4438dcf9 use ValidateSet for WindowsSKU 2024-08-15 20:11:41 -05:00
rbalsleyMSFT e250e2a130 Changed some logging when winget apps can't be found 2024-08-13 16:11:36 -07:00
Doctair dad51fdf80 updated Docs to relect new $UpdatePreviewCU Parameter 2024-08-12 13:15:16 -04:00
Doctair d60b0301c5 Remove a temp copy of BUildScript 2024-08-12 10:15:45 -04:00
Doctair db3e09650a Add new Parameter for Installing Preview CU from
Mircosoft Update Catalog. Recent Windows Pro
not Auto Activating to Enterprise License Bug speared
this idea as its resoleve in lastes Prieview CU.

Parameter is default $False but if set to $true will install
Preivew CU and take precendence over $UpdateLastestCU.
2024-08-12 10:07:41 -04:00
rbalsleyMSFT bcb9911cd0 Small update to fix a logging issue with script run time duration 2024-08-07 13:01:26 -07:00
13 changed files with 1761 additions and 649 deletions
+16
View File
@@ -1,5 +1,21 @@
# Change Log
## **2409.1**
### Fixes
- Fix an issue with removal of Defender/OneDrive/Edge after FFU is complete
- Migrate Winget downloads to use [Export-WingetPackage cmdlet](https://github.com/microsoft/winget-cli/blob/master/doc/specs/%23658%20-%20WinGet%20Download.md#winget-powershell-cmdlet) as per issue #50
- Add support for preview updates https://github.com/rbalsleyMSFT/FFU/pull/51 - thanks to @HedgeComp
- Refactor validation of Unattend/prefixes, PPKG, Autopilot to check for these files early in the process, similar to how we check for drivers
- Add better logging when unable to find HDD when applying FFU. Will inform to add WinPE drivers to Deployment Media if HDD not found.
- Remove ValidateScript on InstallDrivers and break it out in a validation block so -Make and -Model can be specified anywhere in the command line
- Add validation for VMHostIPAddress and VMSwtichName and inform the user if these don't match. Should prevent issues where the FFU isn't getting created.
- Removed installation of the Windows Security Platform Update as it has been removed from the MU Catalog. See issue #58
- Thanks to w0 for PR #54 to change the validation set for WindowsSKU
- Thanks to @zehadialam for PR #60 to fix an issue with Windows boot loader for certain devices where Windows Boot Manager is not the first boot entry after the FFU is applied.
- Thanks to @HedgeComp for PR #64 and PR #65
## **2408.1**
### External Drive Support
@@ -5,9 +5,12 @@ REM d:\Office\setup.exe /configure d:\office\DeployFFU.xml
REM Install Defender Platform Update
REM Install Defender Definitions
REM Install Windows Security Platform Update
REM Install Windows Malicious Software Removal Tool
REM Install OneDrive Per Machine
REM Install Edge Stable
REM Winget Win32 Apps
REM START Batch variables placeholder
REM END Batch variables placeholder
REM Add additional apps below here
REM Contoso App (Example)
REM msiexec /i d:\Contoso\setup.msi /qn /norestart
@@ -30,11 +33,8 @@ for /d %%D in ("%basepath%\*") do (
)
)
)
@REM for %%F in ("!appfolder!\*.xml") do (
@REM set "licensefile=%%F"
@REM )
if defined mainpackage (
set "dism_command=DISM /Online /Add-ProvisionedAppxPackage /PackagePath:"!mainpackage!""
set "dism_command=DISM /Online /Add-ProvisionedAppxPackage /PackagePath:"!mainpackage!" /Region:all /StubPackageOption:installfull"
if exist "!dependenciesfolder!" (
for %%G in ("!dependenciesfolder!\*") do (
set "dism_command=!dism_command! /DependencyPackagePath:"%%G""
@@ -48,7 +48,6 @@ for /d %%D in ("%basepath%\*") do (
) else (
set "dism_command=!dism_command! /SkipLicense"
)
set "dism_command=!dism_command! /Region:All"
echo !dism_command!
!dism_command!
)
File diff suppressed because it is too large Load Diff
Binary file not shown.
+51 -30
View File
@@ -4,22 +4,34 @@ param(
$DeployISOPath,
[Switch]$DisableAutoPlay
)
$Host.UI.RawUI.WindowTitle = 'USB Imaging Tool Creator'
$Host.UI.RawUI.WindowTitle = 'Imaging Tool USB Creator'
if($DeployISOPath){
$DevelopmentPath = $DeployISOPath | Split-Path
$ImagesPath = "$DevelopmentPath\FFU"
function WriteLog($LogText) {
$LogFileName = '\Script.log'
$LogFile = $DevelopmentPath + $LogFilename
Add-Content -path $LogFile -value "$((Get-Date).ToString()) $LogText" -Force -ErrorAction SilentlyContinue
Write-Verbose $LogText
}
Function Get-USBDrive {
$USBDrives = (Get-WmiObject -Class Win32_DiskDrive -Filter "MediaType='Removable Media'")
If ($USBDrives -and ($null -eq $USBDrives.count)) {
$USBDrivesCount = 1
function Write-ProgressLog {
param(
[string]$Activity,
[string]$Status
)
Write-Progress -Activity $Activity -Status $Status -PercentComplete (($currentStep / $totalSteps) * 100)
WriteLog $Status
$script:currentStep++
}
else {
Function Get-RemovableDrive {
writelog "Get information for all removable drives"
$USBDrives = Get-WmiObject Win32_DiskDrive | Where-Object {$_.MediaType -eq "Removable media"}
If($USBDrives -and ($null -eq $USBDrives.count)) {
$USBDrivesCount = 1
} else {
$USBDrivesCount = $USBDrives.Count
}
WriteLog "Found $USBDrivesCount USB drives"
@@ -27,20 +39,23 @@ Function Get-USBDrive {
if ($null -eq $USBDrives) {
WriteLog "No removable USB drive found. Exiting"
Write-Error "No removable USB drive found. Exiting"
Pause
exit 1
}
return $USBDrives, $USBDrivesCount
}
}
Function Build-DeploymentUSB{
param(
[Array]$Drives
)
writelog "Checking if ffu files are present in the ffu folder"
$Images = Get-ChildItem -Path $FFUPath -Filter "*.ffu" -File -Recurse
writelog "Creating list of FFU image files"
$Images = Get-ChildItem -Path $ImagesPath -Filter "*.ffu" -File -Recurse
writelog "Checking if drivers are present in the drivers folder"
$Drivers = Get-ChildItem -Path $DriversPath -Recurse
$DrivesCount = $Drives.Count
Writelog "Creating partitions..."
Write-ProgressLog "Create Imaging Tool" "Creating partitions..."
writelog "Create job to partition each usb drive"
foreach ($USBDrive in $Drives) {
$DriveNumber = $USBDrive.DeviceID.Replace("\\.\PHYSICALDRIVE", "")
$Model = $USBDrive.model
@@ -65,7 +80,7 @@ Function Build-DeploymentUSB{
if($DrivesCount -gt 1){
writelog "Get file system information for all drives"
$Partitions = Get-Partition | Get-Volume
}else{
} else {
writelog "Get file system information for drive number $DiskNumber"
$Partitions = Get-Partition -DiskNumber $DriveNumber | Get-Volume
}
@@ -97,11 +112,19 @@ $Destination = $Drive + ":\"
[string]$SFolder,
[string]$DFolder
)
New-Item -Path $DFolder -ItemType Directory -Force -Confirm: $false | Out-Null
Robocopy $SFolder $DFolder /E /COPYALL /R:5 /W:5 /J
}
WriteLog "Start job to copy all FFU files to $Destination"
Start-Job -ScriptBlock $jobScriptBlock -ArgumentList $FFUPath, $Destination | Out-Null
Start-Job -ScriptBlock $jobScriptBlock -ArgumentList $ImagesPath, $Destination | Out-Null
}
}
if(!($Images)){
foreach ($Drive in $DeployDrives) {
WriteLog "Create images directory"
$drivepath = $Drive + ":\"
New-Item -Path "$drivepath" -Name Images -ItemType Directory -Force -Confirm: $false | Out-Null
}
}
if($Drivers){
@@ -128,14 +151,14 @@ if(!($Drivers)){
}
}
if($DrivesCount -gt 1){
Writelog "Building $DrivesCount drives concurrently...Please be patient..."
}else{
Writelog "Building the imaging tool on $model...Please be patient..."
Write-ProgressLog "Create Imaging Tool" "Building $DrivesCount drives concurrently...Please be patient..."
} else {
Write-ProgressLog "Create Imaging Tool" "Building the imaging tool on $model...Please be patient..."
}
Get-Job | Wait-Job | Out-Null
Dismount-DiskImage -ImagePath $DeployISOPath | Out-Null
Writelog "Drive creation jobs completed..."
Write-ProgressLog "Create Imaging Tool" "Drive creation jobs completed..."
}
Function New-DeploymentUSB {
@@ -167,20 +190,15 @@ Function New-DeploymentUSB {
$var = $true
$DriveSelected = Read-Host 'Enter the drive number to apply the .iso to'
$DriveSelected = ($DriveSelected -as [int]) -1
if($Last){
writelog "All drives selected"
}else{
writelog "Drive $DriveSelected selected"}
writelog "Drive $DriveSelected selected"
}
catch {
Write-Host 'Input was not in correct format. Please enter a valid FFU number'
$var = $false
}
} until (($DriveSelected -le $Count -1 -or $last) -and $var)
$DisableAutoPlayCurrentSetting = (Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers" -Name DisableAutoplay).DisableAutoplay
if($DisableAutoPlay -and $DisableAutoPlayCurrentSetting -ne 1){
writelog "Disable autoPlay current setting is $DisableAutoPlayCurrentSetting"
if($DisableAutoPlay){
WriteLog "Setting the registry key to disable autoplay for all drives"
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers" -Name "DisableAutoplay" -Value 1 -Type DWORD
}
@@ -193,16 +211,16 @@ Function New-DeploymentUSB {
if($Selection -eq $last){
Read-Host -Prompt "ALL DRIVES SELECTED! WILL ERASE ALL CURRENTLY CONNECTED USB DRIVES!! Press ENTER to continue"
Build-DeploymentUSB -Drives $Drives
}else{
} else {
Read-Host -Prompt "Drive number $Selection was selected. Press ENTER to continue"
Build-DeploymentUSB -Drives $Drives[$DriveSelected]
}
WriteLog "Setting the registry key to re-enable autoplay for all drives"
if($DisableAutoPlay){
Writelog "Setting disable autoplay setting back to $DisableAutoPlayCurrentSetting"
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers" -Name "DisableAutoplay" -Value $DisableAutoPlayCurrentSetting -Type DWORD
Write-ProgressLog "Create Imaging Tool" "Enabling Autoplay"
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers" -Name "DisableAutoplay" -Value 0 -Type DWORD
}
Writelog "Completed!"
Write-ProgressLog "Create Imaging Tool" "Completed!"
}
#Get USB Drive and create log file
if(Test-Path "$DevelopmentPath\Script.log"){
@@ -211,12 +229,15 @@ New-item -Path $DevelopmentPath -Name 'Script.log' -ItemType "file" -Force | Out
}
WriteLog 'Begin Logging'
WriteLog 'Getting USB drive information and usb drive count'
$USBDrives,$USBDrivesCount = Get-USBDrive
$USBDrives,$USBDrivesCount = Get-RemovableDrive
WriteLog 'Setting first step for percentage progress bar'
$currentStep = 1
New-DeploymentUSB -Drives $USBDrives -Count $USBDrivesCount
read-host -Prompt "USB drive creation complete. Press ENTER to exit"
Exit
}else{
} else {
Write-Host "No .ISO file selected..."
read-host "Press ENTER to Exit..."
Exit
@@ -1,5 +1,6 @@
#Modify the net use W: \\192.168.1.158\FFUCaptureShare /user:ffu_user ddb1f077-3eed-433c-b4d9-7b8cd54ce727
net use W: \\192.168.1.158\FFUCaptureShare /user:ffu_user ddb1f077-3eed-433c-b4d9-7b8cd54ce727
#Custom naming placeholder
$AssignDriveLetter = 'x:\AssignDriveLetter.txt'
Start-Process -FilePath diskpart.exe -ArgumentList "/S $AssignDriveLetter" -Wait -ErrorAction Stop | Out-Null
@@ -11,53 +12,89 @@ reg load "HKLM\FFU" $Software
$SKU = Get-ItemPropertyValue -Path 'HKLM:\FFU\Microsoft\Windows NT\CurrentVersion\' -Name 'EditionID'
[int]$CurrentBuild = Get-ItemPropertyValue -Path 'HKLM:\FFU\Microsoft\Windows NT\CurrentVersion\' -Name 'CurrentBuild'
$DisplayVersion = Get-ItemPropertyValue -Path 'HKLM:\FFU\Microsoft\Windows NT\CurrentVersion\' -Name 'DisplayVersion'
if ($CurrentBuild -notin 14393, 17763) {
$WindowsVersion = Get-ItemPropertyValue -Path 'HKLM:\FFU\Microsoft\Windows NT\CurrentVersion\' -Name 'DisplayVersion'
}
$InstallationType = Get-ItemPropertyValue -Path 'HKLM:\FFU\Microsoft\Windows NT\CurrentVersion\' -Name 'InstallationType'
$BuildDate = Get-Date -uformat %b%Y
$SKU = switch ($SKU) {
Core { 'Home' }
CoreN { 'HomeN'}
CoreSingleLanguage { 'HomeSL'}
CoreN { 'HomeN' }
CoreSingleLanguage { 'HomeSL' }
Professional { 'Pro' }
ProfessionalN { 'ProN'}
ProfessionalN { 'ProN' }
ProfessionalEducation { 'Pro_Edu' }
ProfessionalEducationN { 'Pro_EduN' }
Enterprise { 'Ent' }
EnterpriseN { 'EntN'}
EnterpriseN { 'EntN' }
Education { 'Edu' }
EducationN { 'EduN'}
EducationN { 'EduN' }
ProfessionalWorkstation { 'Pro_Wks' }
ProfessionalWorkstationN { 'Pro_WksN' }
ServerStandard { 'Srv_Std' }
ServerDatacenter { 'Srv_Dtc' }
}
if($CurrentBuild -ge 22000){
$Name = 'Win11'
if ($InstallationType -eq "Client") {
if ($CurrentBuild -ge 22000) {
$WindowsRelease = 'Win11'
}
else {
$WindowsRelease = 'Win10'
}
}
else{
$Name = 'Win10'
else {
$WindowsRelease = switch ($CurrentBuild) {
26100 { '2025' }
20348 { '2022' }
17763 { '2019' }
14393 { '2016' }
Default { $WindowsVersion }
}
if ($InstallationType -eq "Server Core") {
$SKU += "_Core"
}
}
#If Office is installed, modify the file name of the FFU
#$Office = Get-childitem -Path 'M:\Program Files\Microsoft Office' -ErrorAction SilentlyContinue | Out-Null
$Office = Get-childitem -Path 'M:\Program Files\Microsoft Office' -ErrorAction SilentlyContinue
if($Office){
$ffuFilePath = "W:\$Name`_$DisplayVersion`_$SKU`_Office`_$BuildDate.ffu"
$dismArgs = "/capture-ffu /imagefile=$ffuFilePath /capturedrive=\\.\PhysicalDrive0 /name:$Name$DisplayVersion$SKU /Compress:Default"
}
else{
$ffuFilePath = "W:\$Name`_$DisplayVersion`_$SKU`_Apps`_$BuildDate.ffu"
$dismArgs = "/capture-ffu /imagefile=$ffuFilePath /capturedrive=\\.\PhysicalDrive0 /name:$Name$DisplayVersion$SKU /Compress:Default"
if ($CustomFFUNameTemplate) {
$CustomFFUNameTemplate = $CustomFFUNameTemplate -replace '{WindowsRelease}', $WindowsRelease
$CustomFFUNameTemplate = $CustomFFUNameTemplate -replace '{WindowsVersion}', $WindowsVersion
$CustomFFUNameTemplate = $CustomFFUNameTemplate -replace '{SKU}', $SKU
$CustomFFUNameTemplate = $CustomFFUNameTemplate -replace '{BuildDate}', $BuildDate
$CustomFFUNameTemplate = $CustomFFUNameTemplate -replace '{yyyy}', (Get-Date -UFormat '%Y')
$CustomFFUNameTemplate = $CustomFFUNameTemplate -creplace '{MM}', (Get-Date -UFormat '%m')
$CustomFFUNameTemplate = $CustomFFUNameTemplate -replace '{dd}', (Get-Date -UFormat '%d')
$CustomFFUNameTemplate = $CustomFFUNameTemplate -creplace '{HH}', (Get-Date -UFormat '%H')
$CustomFFUNameTemplate = $CustomFFUNameTemplate -creplace '{hh}', (Get-Date -UFormat '%I')
$CustomFFUNameTemplate = $CustomFFUNameTemplate -creplace '{mm}', (Get-Date -UFormat '%M')
$CustomFFUNameTemplate = $CustomFFUNameTemplate -replace '{tt}', (Get-Date -UFormat '%p')
if($CustomFFUNameTemplate -notlike '*.ffu') {
$CustomFFUNameTemplate += '.ffu'
}
$dismArgs = "/capture-ffu /imagefile=W:\$CustomFFUNameTemplate /capturedrive=\\.\PhysicalDrive0 /name:$WindowsRelease$WindowsVersion$SKU /Compress:Default"
} else {
#If Office is installed, modify the file name of the FFU
#$Office = Get-childitem -Path 'M:\Program Files\Microsoft Office' -ErrorAction SilentlyContinue | Out-Null
$Office = Get-ChildItem -Path 'M:\Program Files\Microsoft Office' -ErrorAction SilentlyContinue
if ($Office) {
$ffuFilePath = "W:\$WindowsRelease`_$WindowsVersion`_$SKU`_Office`_$BuildDate.ffu"
} else {
$ffuFilePath = "W:\$WindowsRelease`_$WindowsVersion`_$SKU`_Apps`_$BuildDate.ffu"
}
$dismArgs = "/capture-ffu /imagefile=$ffuFilePath /capturedrive=\\.\PhysicalDrive0 /name:$WindowsRelease$WindowsVersion$SKU /Compress:Default"
}
#Unload Registry
Set-Location X:\
Remove-Variable SKU
Remove-Variable CurrentBuild
Remove-Variable DisplayVersion
Remove-Variable Office
if ($CurrentBuild -notin 14393, 17763) {
Remove-Variable WindowsVersion
}
if($Office) {
Remove-Variable Office
}
reg unload "HKLM\FFU"
#This prevents Critical Process Died errors you can have during deployment of the FFU - may not happen during capture from WinPE, but adding here to be consistent with VHDX capture
Write-Host "Sleeping for 60 seconds to allow registry to unload prior to capture"
@@ -65,5 +102,4 @@ Start-sleep 60
Start-Process -FilePath dism.exe -ArgumentList $dismArgs -Wait -PassThru -ErrorAction Stop | Out-Null
#Copy DISM log to Host
xcopy X:\Windows\logs\dism\dism.log W:\ /Y | Out-Null
wpeutil Shutdown
@@ -55,11 +55,18 @@ function Set-DiskpartAnswerFiles($DiskpartFile,$DiskID){
function Set-Computername($computername){
[xml]$xml = Get-Content $UnattendFile
if($xml.unattend.settings.component.Count -ge 2){
#Assumes that Computername is the first component element
$xml.unattend.settings.component[0].ComputerName = $computername
}else{
$xml.unattend.settings.component.ComputerName = $computername
$components = $xml.unattend.settings.component
$found = $false
foreach ($component in $components) {
if ($component.ComputerName) {
$component.ComputerName = $computername
$found = $true
break
}
}
if (-not $found) {
WriteLog 'ComputerName element not found in unattend.xml.'
throw 'ComputerName element not found in unattend.xml.'
}
$xml.Save($UnattendFile)
return $computername
@@ -128,13 +135,18 @@ $LogFileName = 'ScriptLog.txt'
$USBDrive = Get-USBDrive
New-item -Path $USBDrive -Name $LogFileName -ItemType "file" -Force | Out-Null
$LogFile = $USBDrive + $LogFilename
$version = '2408.1'
$version = '2412.1'
WriteLog 'Begin Logging'
WriteLog "Script version: $version"
#Find PhysicalDrive
# $PhysicalDeviceID = Get-HardDrive
$hardDrive = Get-HardDrive
if($null -eq $hardDrive){
WriteLog 'No hard drive found. Exiting'
WriteLog 'Try adding storage drivers to the PE boot image (you can re-create your FFU and USB drive and add the PE drivers to the PEDrivers folder and add -CopyPEDrivers $true to the command line, or manually add them via DISM)'
Exit
}
$PhysicalDeviceID = $hardDrive.DeviceID
$BytesPerSector = $hardDrive.BytesPerSector
WriteLog "Physical BytesPerSector is $BytesPerSector"
@@ -549,6 +561,12 @@ If (Test-Path -Path $Drivers)
WriteLog 'Copying drivers succeeded'
}
WriteLog "Setting Windows Boot Manager to be first in the display order."
Invoke-Process bcdedit.exe "/set {fwbootmgr} displayorder {bootmgr} /addfirst"
WriteLog "Windows Boot Manager has been set to be first in the display order."
WriteLog "Setting default Windows boot loader to be first in the display order."
Invoke-Process bcdedit.exe "/set {bootmgr} displayorder {default} /addfirst"
WriteLog "The default Windows boot loader has been set to be first in the display order."
#Copy DISM log to USBDrive
WriteLog "Copying dism log to $USBDrive"
invoke-process xcopy "X:\Windows\logs\dism\dism.log $USBDrive /Y"
Binary file not shown.
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
<settings pass="specialize">
<!--<ComputerName> must be in the first Component Element "Microsoft-Windows-Shell-Setup" . Do not change the order or remove it -->
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ComputerName>MYCOMPUTER</ComputerName><!--Leave Default will be renamed-->
<TimeZone>Eastern Standard Time</TimeZone><!--Add Your Local TimeZone-->
</component>
<!-- Place additional Components Elements and Settings below here: -->
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RunASynchronous>
<RunASynchronousCommand wcm:action="add">
<Order>1</Order>
<Path>cmd.exe /c date 09-07-2024</Path> <!--Set the device clock to the current date. Helpful when BIOS clocks out of sync. -->
<Description>Set system date to a specific date</Description>
</RunASynchronousCommand>
</RunASynchronous>
</component>
</settings>
<settings pass="oobeSystem">
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<InputLocale>0409:00000409</InputLocale><!--Set your Keybaord and System Local https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-8.1-and-8/hh825682(v=win.10) -->
<SystemLocale>en-US</SystemLocale>
<UILanguage>en-US</UILanguage>
<UserLocale>en-US</UserLocale>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<OOBE>
<ProtectYourPC>3</ProtectYourPC> <!--Disable Diagnostic Data sent to Microsoft-->
<HideEULAPage>true</HideEULAPage><!--Hide the End User License agreement -->
<HideWirelessSetupInOOBE>false</HideWirelessSetupInOOBE> <!--Show Wifi Setup -->
</OOBE>
</component>
</settings>
</unattend>
+3 -1
View File
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
<settings pass="specialize">
<!--<ComputerName> must be in the first Component Element "Microsoft-Windows-Shell-Setup" . Do not change the order or remove it -->
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="arm64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ComputerName>MyComputer</ComputerName>
</component>
<!--Place addtional Components Elements and settings below here. -->
</settings>
</unattend>
+3 -1
View File
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
<settings pass="specialize">
<!--<ComputerName> must be in the first Component Element "Microsoft-Windows-Shell-Setup" . Do not change the order or remove it -->
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ComputerName>MyComputer</ComputerName>
</component>
<!--Place addtional Components Elements and settings below here. -->
</settings>
</unattend>
+1 -1
View File
@@ -20,7 +20,7 @@ The Full-Flash update (FFU) process can automatically download the latest releas
# Updates
2408.1 has been released! Check out the changes in the [Change Log](ChangeLog.md)
2409.1 has been released! Check out the changes in the [Change Log](ChangeLog.md)
# Getting Started