Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
bee13a0
refactor(core): rename module driver pack initializer
OSDeploy Aug 5, 2026
4fc9f88
fix(core): support both operating system schemas
OSDeploy Aug 5, 2026
a0aa5e2
docs(core): add operating system object skill
OSDeploy Aug 5, 2026
9035b13
fix(core): initialize module catalog state
OSDeploy Aug 5, 2026
26f6a63
fix(core): store module catalogs in globals
OSDeploy Aug 6, 2026
b3e766f
fix(core): centralize OSDCore cache refresh
OSDeploy Aug 6, 2026
67c9180
fix(core): normalize device identity fields
OSDeploy Aug 6, 2026
39959c0
feat(deployment): add hardware override parameters
OSDeploy Aug 6, 2026
52f8d77
refactor(core): move cache helpers to core-cache
OSDeploy Aug 6, 2026
df9ed88
feat(driver-packs): add cache and cloud object validation
OSDeploy Aug 6, 2026
23fffa6
feat(core): add operating system object validators
OSDeploy Aug 6, 2026
87fd4e7
fix(deployment): harden os and driverpack validation
OSDeploy Aug 6, 2026
da01489
refactor(workflow): add info markers to step logs
OSDeploy Aug 6, 2026
32d6af9
refactor(core): standardize info host logging
OSDeploy Aug 6, 2026
905ee7b
feat(workflow): add os settings validation helpers
OSDeploy Aug 6, 2026
5536e8e
refactor(pe-startup): add info markers to startup logs
OSDeploy Aug 6, 2026
de3aef7
refactor(workflow): centralize os settings resolution
OSDeploy Aug 6, 2026
1fd8e76
refactor(core): improve usb cache object handling
OSDeploy Aug 6, 2026
d6512a9
fix(core): support filepath in os url check
OSDeploy Aug 6, 2026
cd4ecf9
refactor(deployment): unify activation and param forwarding
OSDeploy Aug 6, 2026
606590e
feat(deployment): apply workflow os constraints
OSDeploy Aug 6, 2026
36c407f
fix(deployment): remove unreachable initialization code
OSDeploy Aug 6, 2026
8231139
docs(core): add osdcore cache and device docs
OSDeploy Aug 6, 2026
3c6a0f9
fix(deployment): continue after initialization
OSDeploy Aug 7, 2026
956076a
fix(deployment): use resolved os cloud object
OSDeploy Aug 7, 2026
898e612
refactor(deployment): rename deploy initialization cmdlet
OSDeploy Aug 7, 2026
47d5d15
refactor(core): simplify operating system catalog helpers
OSDeploy Aug 7, 2026
c38edd6
feat(core): export module driver packs to temp xml
OSDeploy Aug 7, 2026
b6c6ede
feat(core): export deployment and device state snapshots
OSDeploy Aug 7, 2026
251501d
refactor(workflow): align MainWindow and deploy flow logic
OSDeploy Aug 7, 2026
1967cab
chore(driver-packs): log catalog update start
OSDeploy Aug 10, 2026
f1b1a7f
feat(deployment): add custom workflow warning
OSDeploy Aug 10, 2026
94af43b
refactor(core): clarify cache and url status logs
OSDeploy Aug 10, 2026
b3c48f4
docs(main): update changelog for branch changes
OSDeploy Aug 10, 2026
2f5225c
docs(pe-startup): add WinPEStartup guide
OSDeploy Aug 12, 2026
066ad9c
docs(changelog): complete branch change notes
OSDeploy Aug 12, 2026
cd3d4c7
feat(deployment): add deployment disk selection
OSDeploy Aug 12, 2026
5599e67
style(deployment): color driver cache success
OSDeploy Aug 12, 2026
86ef03d
feat(deployment): add deployment disk selection
OSDeploy Aug 12, 2026
b048e31
refactor(workflow): streamline step logging
OSDeploy Aug 12, 2026
cc9125b
refactor(workflow): use core device disk check
OSDeploy Aug 12, 2026
970d203
style(core): standardize status output text
OSDeploy Aug 12, 2026
1e62e18
fix(deployment): preserve os language selection
OSDeploy Aug 12, 2026
5372133
refactor(workflow): clean up workflow step scripts
OSDeploy Aug 12, 2026
85d6c67
refactor(deployment): consolidate workflow state
OSDeploy Aug 12, 2026
5276797
chore(workflow): remove retired workflow assets
OSDeploy Aug 13, 2026
22f4a5d
refactor(deployment): consolidate deploy state objects
OSDeploy Aug 13, 2026
26f38a3
refactor(driver-packs): split catalog update functions
OSDeploy Aug 13, 2026
5550129
refactor(deployment): use os cloud cache objects
OSDeploy Aug 14, 2026
d15ae1d
fix(core): hash device identifier for telemetry
OSDeploy Aug 14, 2026
aa4c487
fix(driver-packs): refresh registered catalogs
OSDeploy Aug 14, 2026
0f2e7ac
feat(deployment): add OSDeploy license registration
OSDeploy Aug 14, 2026
561226a
fix(core): harden path cleanup handling
OSDeploy Aug 14, 2026
3b3c857
fix(core): scope deployment catalog state
OSDeploy Aug 14, 2026
d4cb792
feat(workflow): add verbose step diagnostics
OSDeploy Aug 15, 2026
8ee881e
fix(core): correct runtime state handling
OSDeploy Aug 15, 2026
5b41062
fix(driver-packs): refresh stale Surface URLs
OSDeploy Aug 15, 2026
b082e59
docs(readme): correct deployment guidance
OSDeploy Aug 17, 2026
3a4eaa9
style(driver-packs): standardize Recast status messages
OSDeploy Aug 17, 2026
40b35de
refactor(core): rename device identity properties
OSDeploy Aug 17, 2026
7c9c80a
chore(core): update registration and catalogs
OSDeploy Aug 19, 2026
c20f600
refactor(core): rename license helpers
OSDeploy Aug 20, 2026
9de9803
refactor(core): centralize license state
OSDeploy Aug 21, 2026
2820164
feat(pe-startup): refresh WinPE startup flow
OSDeploy Aug 31, 2026
0d869e6
feat(pe-startup): refresh winpe startup flow
OSDeploy Aug 31, 2026
f649c31
feat(pe-startup): refresh winpe startup flow
OSDeploy Aug 31, 2026
63ce68a
chore(driver-packs): update dell and hp driver pack catalogs
OSDeploy Sep 1, 2026
d8f4cea
chore: commit staged changes
OSDeploy Sep 2, 2026
7fe37a0
chore: commit staged changes
OSDeploy Sep 2, 2026
c012d63
chore(driver-packs): update HP driver pack catalog
OSDeploy Sep 3, 2026
6b60791
feat(pe-startup): add shutdown and restart profiles
OSDeploy Sep 3, 2026
58df39c
chore(driver-packs): update HP driver pack catalog
OSDeploy Sep 8, 2026
c76760a
fix(workflow): correct device identity fields
OSDeploy Sep 8, 2026
ac660a9
chore(main): update module version
OSDeploy Sep 8, 2026
9024abd
docs(changelog): update changelog for version 26.9.8.1
OSDeploy Sep 8, 2026
3836102
chore(winpestartup-profiles): remove deprecated startup profile JSON …
OSDeploy Sep 8, 2026
02d3d65
Merge remote-tracking branch 'origin/main' into deer
OSDeploy Sep 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Functions are procedural and single-call, not pipeline-aware. Skip the blocks un
### Global state

`Initialize-*` functions populate `$global:OSDCloud*` variables; `Invoke-*` and `Get-*` functions read them.
Key globals: `$global:OSDCoreDevice`, `$global:OSDCloudDeploy`, `$global:OSDCloudWorkflowTasks`, `$global:OSDCloudWorkflowInvoke`, `$global:Architecture`, `$global:IsWinPE`, `$global:IsVM`, `$global:IsOnBattery`.
Key globals: `$global:OSDCoreDevice`, `$global:OSDCloudDeploy`, `$global:OSDCloudWorkflowTasks`, `$global:OSDCloudWorkflowInvoke`.
Document any new global variables added.

### Naming
Expand All @@ -80,7 +80,7 @@ Document any new global variables added.

### WinPE-specific code

- Guard WinPE-only logic with `$env:SystemDrive -eq 'X:'` or the `$global:IsWinPE` flag
- Guard WinPE-only logic with `$env:SystemDrive -eq 'X:'` flag
- Place WinPE-only exported functions in `public/WinPE/`

## Workflows
Expand Down Expand Up @@ -115,7 +115,7 @@ Version follows `YY.M.D.revision` format – update `ModuleVersion` in `OSDCloud
## Common pitfalls

- `public/WinPE/` functions are **not loaded outside WinPE** – do not call them in normal-environment code.
- The module requires `curl.exe` to be present for download operations – validated in `Initialize-OSDCloudDeploy`.
- The module requires `curl.exe` to be present for download operations – validated in `Initialize-DeployOSDCloud`.
- `HtmlAgilityPack.dll` type is loaded once; re-importing silently skips the Add-Type call but may conflict if another version is loaded first.
- Analytics events (PostHog) are sent during workflow execution – see [PRIVACY.md](../PRIVACY.md) for opt-out details.
- Commit scopes: `workflow`, `driver-packs`, `pe-startup`, `deployment`, `classes`, `catalog`, `core`, `wi-fi`, `main`.
Original file line number Diff line number Diff line change
Expand Up @@ -219,4 +219,4 @@ Key differences:
- **Omitting the build switch case** — a new OS XML will load without errors but produce zero OS options in the UX because every `<File>` hits the `default { continue }` branch.
- **Stale `surface.json` driver URLs** — `Get-OSDCoreDriverPackCatalogSurface` serves MSI URLs from `OSDCloud/core/driverpacks/surface.json`; if `UpdatePage` links change and the automated workflow has not run, deployed drivers may point to outdated or removed files. Run `.github/scripts/Update-MicrosoftCatalog.ps1` manually to refresh.
- **Editing OEM XML snapshots manually** — Dell/HP/Lenovo XML is replaced wholesale from upstream; manual edits will be lost on the next snapshot refresh.
- **Adding a Windows version string to workflow configs without the catalog XML** — the UX will offer the version but `Get-OSDCloudCoreOperatingSystems` will return no matching ESD entries, causing `Initialize-OSDCloudDeploy` to throw.
- **Adding a Windows version string to workflow configs without the catalog XML** — the UX will offer the version but `Get-OSDCloudCoreOperatingSystems` will return no matching ESD entries, causing `Initialize-DeployOSDCloud` to throw.
3 changes: 1 addition & 2 deletions .github/instructions/workflow-tasks.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,7 @@ function step-phase-action {

#endregion
#=================================================
$Message = "[$(Get-Date -format s)] [$($MyInvocation.MyCommand.Name)] End"
Write-Verbose -Message $Message; Write-Debug -Message $Message
Write-Verbose -Message "[$(Get-Date -format s)] [$($MyInvocation.MyCommand.Name)] End"
#=================================================
}
```
Expand Down
100 changes: 100 additions & 0 deletions .github/skills/osdcore-operating-system-cloud-object/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
---
name: osdcore-operating-system-cloud-object
description: "Use when identifying, mapping, reviewing, or changing $OSDCoreOperatingSystemCloudObject, Set-OSDCoreOperatingSystemCloudObject, Get-OSDCoreOperatingSystems, or Get-OSDCloudCoreOperatingSystems across the OSD and OSDCloud PowerShell modules."
argument-hint: "OS filters or code path, for example: Windows 11 25H2 amd64 Retail en-us"
---

# OSD Core Operating System Cloud Object

Use this skill when working on `$global:OSDCoreOperatingSystemCloudObject` or `Set-OSDCoreOperatingSystemCloudObject` in code shared by the `OSD` and `OSDCloud` PowerShell modules.

The important rule: the selected global object is module-native. Do not assume one property schema works everywhere.

## Object Shape Detection

Identify the selected object by its properties before consuming it:

| Module shape | Strong indicators | Provider |
| --- | --- | --- |
| `OSD` | `Name`, `Version`, `ReleaseID`, `Architecture`, `Language`, `Activation`, `Build`, `Url`, `SHA1`, `SHA256` | `Get-OSDCoreOperatingSystems` |
| `OSDCloud` | `Id`, `OperatingSystem`, `OSName`, `OSVersion`, `OSArchitecture`, `OSActivation`, `OSLanguageCode`, `OSBuild`, `OSBuildVersion`, `FilePath`, `Sha1`, `Sha256` | `Get-OSDCloudCoreOperatingSystems` |

Prefer module context when it is available:

```powershell
$moduleName = $MyInvocation.MyCommand.Module.Name
```

Use property detection when an object is passed into helper code:

```powershell
if ($OperatingSystemCloudObject.PSObject.Properties.Name -contains 'OSArchitecture') {
$objectShape = 'OSDCloud'
}
elseif ($OperatingSystemCloudObject.PSObject.Properties.Name -contains 'Architecture') {
$objectShape = 'OSD'
}
else {
throw 'Unable to identify operating system cloud object shape.'
}
```

## Equivalent Properties

Use these equivalences when filtering, sorting, logging, or copying values into deployment globals.

| Concept | OSD property | OSDCloud property |
| --- | --- | --- |
| Display id/name | `Name` | `Id` |
| Windows family | `Version` | `OSName` |
| Release id | `ReleaseID` | `OSVersion` |
| Architecture | `Architecture` | `OSArchitecture` |
| Language code | `Language` | `OSLanguageCode` |
| Activation | `Activation` | `OSActivation` |
| Full build | `Build` | `OSBuildVersion` |
| Major build | derive from `Build` | `OSBuild` |
| Download URL | `Url` | `FilePath` |
| SHA-1 | `SHA1` | `Sha1` |
| SHA-256 | `SHA256` | `Sha256` |
| File name | `FileName` | `FileName` |

PowerShell property lookup is case-insensitive, but preserve the native property names when creating or serializing objects.

## Selection Workflow

1. Read `OSDCloud/private/core-operatingsystem/Set-OSDCoreOperatingSystemCloudObject.ps1` and the provider functions before editing.
2. Determine whether the call is running in `OSD`, `OSDCloud`, or helper/test code without a module name.
3. Load the matching catalog provider:
- `OSD`: `Get-OSDCoreOperatingSystems`
- `OSDCloud`: `Get-OSDCloudCoreOperatingSystems`
4. Normalize input filters before comparing: architecture and language should be lowercase; map `x64` to `amd64` where user input or catalog data can contain either spelling.
5. Filter with equivalent properties, not a single module schema.
6. Sort by the full build equivalent: `Build` for `OSD`, `OSBuildVersion` for `OSDCloud`.
7. Assign the original selected object to `$global:OSDCoreOperatingSystemCloudObject`. Do not reshape it unless the caller explicitly needs a separate compatibility object.
8. Log using the module-native name, build, and file name properties.
9. Validate with at least one `OSD`-shape object and one `OSDCloud`-shape object when practical.

## Safe Access Pattern

For shared consumer code, resolve values through a small local adapter instead of directly reading one schema:

```powershell
$selectedOperatingSystem = $global:OSDCoreOperatingSystemCloudObject

$operatingSystemName = if ($selectedOperatingSystem.OSName) { $selectedOperatingSystem.OSName } else { $selectedOperatingSystem.Version }
$operatingSystemVersion = if ($selectedOperatingSystem.OSVersion) { $selectedOperatingSystem.OSVersion } else { $selectedOperatingSystem.ReleaseID }
$operatingSystemArchitecture = if ($selectedOperatingSystem.OSArchitecture) { $selectedOperatingSystem.OSArchitecture } else { $selectedOperatingSystem.Architecture }
$operatingSystemBuildVersion = if ($selectedOperatingSystem.OSBuildVersion) { $selectedOperatingSystem.OSBuildVersion } else { $selectedOperatingSystem.Build }
$operatingSystemUrl = if ($selectedOperatingSystem.FilePath) { $selectedOperatingSystem.FilePath } else { $selectedOperatingSystem.Url }
```

Keep this adapter close to the consumer unless multiple consumers need it. If multiple consumers repeat the same mapping, add a private helper with comment-based help and `[CmdletBinding()]` following the repo PowerShell instructions.

## Review Checklist

- The function still supports both `OSD` and `OSDCloud` module contexts.
- It does not sort `OSDCloud` records only by `Build`, because that property belongs to the `OSD` shape.
- It does not use `.FilePath` for `OSD` objects or `.Url` for `OSDCloud` objects without a fallback.
- It does not overwrite `$global:OSDCoreOperatingSystemCloudObject` with a cross-module normalized object unless all callers have been reviewed.
- Error messages include the requested release, architecture, activation, language, and OS family/version.
- Any new PowerShell function follows the repo requirements: `[CmdletBinding()]`, comment-based help, `$Error.Clear()`, full cmdlet names, and the standard verbose timestamp pattern.
76 changes: 74 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,78 @@

All notable changes to this project will be documented in this file.

## 26.9.8.1 - September 8, 2026

### Added

- Added deployment disk selection and expanded deployment disk validation.
- Added OSDeploy license registration, license state management, and license help output.
- Added verbose workflow step diagnostics for deployment troubleshooting.
- Added WinPE startup profiles for restart and shutdown actions.
- Added a WinPEStartup guide and updated deployment, troubleshooting, and unattended USB documentation.

### Changed

- Module version bumped to `26.9.8.1`.
- Consolidated deployment, workflow, and device state objects used across deployment execution.
- Improved operating system and driver pack cache object handling, including deployment catalog state scoping and registered catalog refresh behavior.
- Preserved operating system language selections through deployment parameter resolution.
- Improved device identity handling and hashed the device identifier used for telemetry.
- Renamed device identity and license properties to use the current core naming conventions.
- Refreshed WinPEStartup initialization, command execution, module update, Wi-Fi, USB, and device error handling paths.
- Updated workflow step logging, status output, target disk checks, driver pack checks, and Windows image validation.
- Refactored driver pack catalog retrieval and update functions across Dell, HP, Lenovo, Panasonic, and Surface catalogs.
- Updated Windows 11 25H2 operating system catalog content to build `26200.9168`.
- Refreshed Dell and HP driver pack catalogs and Surface driver pack URLs.
- Updated deployment, feature, privacy, and workflow documentation and standardized Recast status messages.

### Removed

- Removed retired workflow assets and legacy workflow UI projects from unused channels.

## 26.8.10.1 - August 10, 2026

### Added

- Added `Initialize-DeployOSDCloud` as the new deployment initialization implementation with expanded deployment/device state handling and validation flow.
- Added cache and validation helpers across core systems:
- `Initialize-OSDCoreCache`
- `Get-OSDCoreDriverPackCacheObject`
- `Get-OSDCoreOperatingSystemCacheObject`
- `Test-OSDCoreDriverPackCloudObject`
- `Test-OSDCoreOperatingSystemCloudObject`
- Added workflow operating system helper functions:
- `Get-OSDCloudWorkflowSettingsOSFile`
- `Resolve-OSDCloudWorkflowOSActivation`
- `Test-OSDCloudWorkflowSettingsOS`
- Added deployment hardware override support for workflow-driven operating system selection constraints.
- Added deployment and device state snapshot exports for the revised deployment initialization flow.
- Added module driver pack catalog export support for temporary XML snapshots.
- Added repository documentation pages `docs/about_osdcorecache.md`, `docs/about_osdcoredevice.md`, and `docs/about_winpestartup.md`.
- Added the `osdcore-operating-system-cloud-object` Copilot skill for core operating system object mapping and maintenance.

### Changed

- Module version bumped to `26.8.10.1`.
- Refactored deployment initialization by replacing `Initialize-OSDCloudDeploy` usage with `Initialize-DeployOSDCloud` across deployment entry points (`Deploy-OSDCloud`, `Deploy-OSDCloudCLI`, and `Deploy-OSDCloudGUI`).
- Renamed module catalog initializer functions to align naming and intent:
- `Get-ModuleCoreDriverPacks` -> `Initialize-ModuleCoreDriverPacks`
- `Get-ModuleCoreOperatingSystems` -> `Initialize-ModuleCoreOperatingSystems`
- Centralized and reorganized cache handling by moving cache helpers from `private/core-device/` to `private/core-cache/` and improving USB cache object refresh behavior.
- Improved deployment startup behavior by continuing after initialization, removing unreachable initialization code, using resolved operating system cloud objects, and warning when custom workflow settings are supplied.
- Improved core operating system and driver pack selection reliability by validating cloud/cache objects, normalizing schema handling, and supporting file-path based operating system URL checks.
- Improved cache, operating system URL, device identity, and catalog initialization status logging for clearer troubleshooting.
- Improved workflow operating system resolution and parameter flow by centralizing OS settings selection and activation resolution logic.
- Updated workflow and task execution scripts with standardized informational logging markers and aligned step/test behavior for target disk, driver pack, and Windows image validation.
- Updated WinPEStartup components, including Wi-Fi and USB drive-letter initialization paths, to align with the revised deployment/core orchestration flow.
- Updated Microsoft Update Catalog save helpers and related driver workflow step behavior to match revised validation and logging patterns.
- Updated workflow UI `MainWindow` scripts across classic, default, dev, insiders, and vNext channels for consistency with the updated deployment flow.
- Updated repository guidance in Copilot instruction assets and catalog update instructions.

### Removed

- Removed legacy `Initialize-OSDCloudDeploy.ps1` in favor of `Initialize-DeployOSDCloud.ps1`.

## 26.8.18.1 - August 18, 2026

### Added
Expand Down Expand Up @@ -68,7 +140,7 @@ All notable changes to this project will be documented in this file.

### Added

- Added WinPE startup profiles for `Deploy-OSDCloud` and `Show-OSDCloudDeviceInfo`.
- Added WinPEStartup profiles for `Deploy-OSDCloud` and `Show-OSDCloudDeviceInfo`.

### Changed

Expand Down Expand Up @@ -262,7 +334,7 @@ All notable changes to this project will be documented in this file.
add `INPUTS`/`OUTPUTS`/`NOTES` sections, and cross-link related pages.
- Conceptual guides in `docs/`:
- `getting-started.md` — installation, quick start, and cmdlet overview.
- `winpe-startup.md` — WinPE startup sequence, script hooks, USB profiles,
- `winpe-startup.md` — WinPEStartup sequence, script hooks, USB profiles,
and `InvokeXxxCommand` behaviour.
- `psoptions.md` — two-layer `PSDefaultParameterValues` system with full
key reference table and override examples.
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ single-call and procedural.

**WinPE-only code:**

- Guard any WinPE-only logic with `$env:SystemDrive -eq 'X:'` or `$global:IsWinPE`.
- Guard any WinPE-only logic with `$env:SystemDrive -eq 'X:'`.
- Place WinPE-only exported functions in `public/WinPE/`. Functions in this
directory are **not loaded** in a normal Windows session.

Expand Down
2 changes: 1 addition & 1 deletion FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

---

## WinPE Startup Orchestration
## WinPEStartup Orchestration

`Invoke-WinPEStartup` automates everything between power-on and deployment — loading drivers, connecting to the network, and auto-updating OSDCloud — in a single command. Drop a JSON profile on a USB drive for site-specific settings without touching the boot image. Extend the sequence with custom PowerShell or a HTTPS URL at any phase.

Expand Down
4 changes: 2 additions & 2 deletions OSDCloud/OSDCloud.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
@{
# --- Identity ---
RootModule = 'OSDCloud.psm1'
ModuleVersion = '26.8.18.1'
ModuleVersion = '26.9.8.1'
CompatiblePSEditions = @('Core','Desktop')
GUID = '2fbd5c65-79c7-4561-9a2e-c4a4eebc89c7'

Expand All @@ -17,7 +17,7 @@
CompanyName = 'Recast Software'
Copyright = '(c) 2026 Recast Software. All rights reserved.'
Description = @'
PowerShell module for OSDCloud v2 deployment automation and WinPE Startup from recastsoftware.com.
PowerShell module for OSDCloud v2 deployment automation and WinPEStartup from recastsoftware.com.
Includes operating system, driver pack, and device provisioning workflows.
'@

Expand Down
Loading