Projects/OSDCloudGUI.ps1
#================================================ # Window Functions # Minimize Command and PowerShell Windows #================================================ $Script:showWindowAsync = Add-Type -MemberDefinition @" [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); "@ -Name "Win32ShowWindowAsync" -Namespace Win32Functions -PassThru function Hide-CmdWindow() { $CMDProcess = Get-Process -Name cmd -ErrorAction Ignore foreach ($Item in $CMDProcess) { $null = $showWindowAsync::ShowWindowAsync((Get-Process -Id $Item.id).MainWindowHandle, 2) } } function Hide-PowershellWindow() { $null = $showWindowAsync::ShowWindowAsync((Get-Process -Id $pid).MainWindowHandle, 2) } function Show-PowershellWindow() { $null = $showWindowAsync::ShowWindowAsync((Get-Process -Id $pid).MainWindowHandle, 10) } Hide-CmdWindow Hide-PowershellWindow #================================================ # Get MyScriptDir #================================================ $Global:MyScriptDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition) #================================================ # Load Assemblies #================================================ [System.Reflection.Assembly]::LoadWithPartialName("presentationframework") | Out-Null [System.Reflection.Assembly]::LoadFrom("$Global:MyScriptDir\assembly\System.Windows.Interactivity.dll") | Out-Null #================================================ # Set PowerShell Window Title #================================================ #$host.ui.RawUI.WindowTitle = "OSDCloudGUI" #================================================ # Test-InWinPE #================================================ function Test-InWinPE { return Test-Path -Path Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlset\Control\MiniNT } #================================================ # LoadForm #================================================ function LoadForm { [CmdletBinding()] param( [Parameter(Mandatory = $false, Position = 1)] [string]$XamlPath ) # Import the XAML code [xml]$Global:XamlCode = Get-Content -Path $XamlPath Try { Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase,system.windows.forms } Catch { Throw "Failed to load Windows Presentation Framework assemblies." } #Create the XAML reader using a new XML node reader $Global:XamlWindow = [Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $Global:XamlCode)) #Create hooks to each named object in the XAML $Global:XamlCode.SelectNodes("//*[@Name]") | ForEach-Object { Set-Variable -Name ($_.Name) -Value $Global:XamlWindow.FindName($_.Name) -Scope Global } } #================================================ # LoadForm #================================================ LoadForm -XamlPath (Join-Path $Global:MyScriptDir 'OSDCloudGUI.xaml') #================================================ # Initialize #================================================ $OSDCloudParams = (Get-Command Start-OSDCloud).Parameters $OSDCloudParams["OSBuild"].Attributes.ValidValues | ForEach-Object { $OSBuildControl.Items.Add($_) | Out-Null } $OSDCloudParams["OSEdition"].Attributes.ValidValues | ForEach-Object { $OSEditionControl.Items.Add($_) | Out-Null } $OSDCloudParams["OSLicense"].Attributes.ValidValues | ForEach-Object { $OSLicenseControl.Items.Add($_) | Out-Null } $OSDCloudParams["OSLanguage"].Attributes.ValidValues | ForEach-Object { $OSLanguageControl.Items.Add($_) | Out-Null } $CSManufacturerControl.Text = Get-MyComputerManufacturer -Brief $CSProductControl.Text = Get-MyComputerProduct $CSModelControl.Text = Get-MyComputerModel -Brief #================================================ # SetDefaultValues #================================================ function SetDefaultValues { $OSBuildControl.SelectedIndex = 1 #21H1 $OSLanguageControl.SelectedIndex = 7 #en-us $OSEditionControl.SelectedIndex = 5 #Enterprise $OSLicenseControl.SelectedIndex = 1 #Volume $CustomImageControl.SelectedIndex = 0 #Nothing $AutopilotJsonControl.SelectedIndex = 1 #OOBE $ImageIndexControl.Text = 6 #Enterprise $OSBuildControl.IsEnabled = $true $OSEditionControl.IsEnabled = $true $OSLanguageControl.IsEnabled = $true $OSLicenseControl.IsEnabled = $false $ImageIndexControl.IsEnabled = $false $CSModelControl.IsEnabled = $false $AutopilotJsonControl.IsEnabled = $true $GetWindowsImageControl.Items.Clear() $GetWindowsImageControl.Visibility = "Collapsed" $OperatingSystemLabel.Content = "Cloud Windows 10 x64" $OperatingSystemLabel.Width = "210" $OSBuildControl.Visibility = "Visible" $OSEditionControl.Visibility = "Visible" $OSLanguageControl.Visibility = "Visible" $OSLicenseControl.Visibility = "Visible" } SetDefaultValues #================================================ # CustomImage #================================================ $CustomImageControl.IsEnabled = $false $CustomImageIso = @() [array]$CustomImageIso = Find-OSDCloudFile -Name '*.iso' -Path '\OSDCloud\OS\' foreach ($Item in $CustomImageIso) { if ((Get-DiskImage -ImagePath $Item.FullName).Attached) { #ISO is already mounted } else { Write-Host "Attaching ISO $($Item.FullName)" -ForegroundColor Cyan Mount-DiskImage -ImagePath $Item.FullName } } $CustomImageChildItem = @() [array]$CustomImageChildItem = Find-OSDCloudFile -Name '*.wim' -Path '\OSDCloud\OS\' [array]$CustomImageChildItem += Find-OSDCloudFile -Name 'install.wim' -Path '\Sources\' $CustomImageChildItem = $CustomImageChildItem | Sort-Object -Property Length -Unique | Sort-Object FullName | Where-Object {$_.Length -gt 3GB} if ($CustomImageChildItem) { $CustomImageControl.Items.Add('') | Out-Null $CustomImageControl.IsEnabled = $true $CustomImageChildItem | ForEach-Object { $CustomImageControl.Items.Add($_) | Out-Null } $CustomImageControl.SelectedIndex = 0 } else { $CustomImageLabel.Visibility = "Collapsed" $CustomImageControl.Visibility = "Collapsed" } #================================================ # AutopilotJsonControl #================================================ $AutopilotJsonControl.IsEnabled = $false $AutopilotJsonChildItem = @() [array]$AutopilotJsonChildItem = Find-OSDCloudFile -Name "*.json" -Path '\OSDCloud\Autopilot\Profiles\' | Sort-Object FullName [array]$AutopilotJsonChildItem += Find-OSDCloudFile -Name "*.json" -Path '\OSDCloud\Config\AutopilotJSON\' | Sort-Object FullName $AutopilotJsonChildItem = $AutopilotJsonChildItem | Where-Object {$_.FullName -notlike "C*"} if ($AutopilotJsonChildItem) { $AutopilotJsonControl.Items.Add('') | Out-Null $AutopilotJsonControl.IsEnabled = $true $AutopilotJsonChildItem | ForEach-Object { $AutopilotJsonControl.Items.Add($_) | Out-Null } $AutopilotJsonControl.SelectedIndex = 1 } else { $AutopilotJsonLabel.Visibility = "Collapsed" $AutopilotJsonControl.Visibility = "Collapsed" } #================================================ # OOBEDeployControl #================================================ $OOBEDeployControl.IsEnabled = $false $OOBEDeployJsonChildItem = Find-OSDCloudFile -Name "*.json" -Path '\OSDCloud\Config\OOBEDeploy\' | Sort-Object FullName $OOBEDeployJsonChildItem = $OOBEDeployJsonChildItem | Where-Object {$_.FullName -notlike "C*"} if ($OOBEDeployJsonChildItem) { $OOBEDeployControl.Items.Add('') | Out-Null $OOBEDeployControl.IsEnabled = $true $OOBEDeployJsonChildItem | ForEach-Object { $OOBEDeployControl.Items.Add($_) | Out-Null } $OOBEDeployControl.SelectedIndex = 1 } else { $OOBEDeployLabel.Visibility = "Collapsed" $OOBEDeployControl.Visibility = "Collapsed" } #================================================ # AutopilotOOBEControl #================================================ $AutopilotOOBEControl.IsEnabled = $false $AutopilotOOBEJsonChildItem = Find-OSDCloudFile -Name "*.json" -Path '\OSDCloud\Config\AutopilotOOBE\' | Sort-Object FullName $AutopilotOOBEJsonChildItem = $AutopilotOOBEJsonChildItem | Where-Object {$_.FullName -notlike "C*"} if ($AutopilotOOBEJsonChildItem) { $AutopilotOOBEControl.Items.Add('') | Out-Null $AutopilotOOBEControl.IsEnabled = $true $AutopilotOOBEJsonChildItem | ForEach-Object { $AutopilotOOBEControl.Items.Add($_) | Out-Null } $AutopilotOOBEControl.SelectedIndex = 1 } else { $AutopilotOOBELabel.Visibility = "Collapsed" $AutopilotOOBEControl.Visibility = "Collapsed" } #================================================ # OSEditionControl #================================================ $OSEditionControl.add_SelectionChanged({ #Home if ($OSEditionControl.SelectedIndex -eq 0) { $ImageIndexControl.Text = 4 $ImageIndexLabel.IsEnabled = $false $ImageIndexControl.IsEnabled = $false #Disable $OSLicenseControl.SelectedIndex = 0 #Retail $OSLicenseControl.IsEnabled = $false #Disable } #Home N if ($OSEditionControl.SelectedIndex -eq 1) { $ImageIndexControl.Text = 5 $ImageIndexControl.IsEnabled = $false #Disable $OSLicenseControl.SelectedIndex = 0 #Retail $OSLicenseControl.IsEnabled = $false #Disable } #Home Single Language if ($OSEditionControl.SelectedIndex -eq 2) { $ImageIndexControl.Text = 6 $ImageIndexControl.IsEnabled = $false #Disable $OSLicenseControl.SelectedIndex = 0 #Retail $OSLicenseControl.IsEnabled = $false #Disable } #Education if ($OSEditionControl.SelectedIndex -eq 3) { $OSLicenseControl.IsEnabled = $true if ($OSLicenseControl.SelectedIndex -eq 0) { $ImageIndexControl.Text = 7 } else { $ImageIndexControl.Text = 4 } } #Education N if ($OSEditionControl.SelectedIndex -eq 4) { $OSLicenseControl.IsEnabled = $true if ($OSLicenseControl.SelectedIndex -eq 0) { $ImageIndexControl.Text = 8 } else { $ImageIndexControl.Text = 5 } } #Enterprise if ($OSEditionControl.SelectedIndex -eq 5) { $OSLicenseControl.SelectedIndex = 1 $OSLicenseControl.IsEnabled = $false $ImageIndexControl.Text = 6 } #Enterprise N if ($OSEditionControl.SelectedIndex -eq 6) { $OSLicenseControl.SelectedIndex = 1 $OSLicenseControl.IsEnabled = $false $ImageIndexControl.Text = 7 } #Pro if ($OSEditionControl.SelectedIndex -eq 7) { $OSLicenseControl.IsEnabled = $true if ($OSLicenseControl.SelectedIndex -eq 0) { $ImageIndexControl.Text = 9 } else { $ImageIndexControl.Text = 8 } } #Pro N if ($OSEditionControl.SelectedIndex -eq 8) { $OSLicenseControl.IsEnabled = $true if ($OSLicenseControl.SelectedIndex -eq 0) { $ImageIndexControl.Text = 10 } else { $ImageIndexControl.Text = 9 } } }) #================================================ # OSLicenseControl #================================================ $OSLicenseControl.add_SelectionChanged({ if ($OSLicenseControl.SelectedIndex -eq 0) { if ($OSEditionControl.SelectedIndex -eq 3) {$ImageIndexControl.Text = 7} if ($OSEditionControl.SelectedIndex -eq 4) {$ImageIndexControl.Text = 8} if ($OSEditionControl.SelectedIndex -eq 7) {$ImageIndexControl.Text = 9} if ($OSEditionControl.SelectedIndex -eq 8) {$ImageIndexControl.Text = 10} } if ($OSLicenseControl.SelectedIndex -eq 1) { if ($OSEditionControl.SelectedIndex -eq 3) {$ImageIndexControl.Text = 4} if ($OSEditionControl.SelectedIndex -eq 4) {$ImageIndexControl.Text = 5} if ($OSEditionControl.SelectedIndex -eq 7) {$ImageIndexControl.Text = 8} if ($OSEditionControl.SelectedIndex -eq 8) {$ImageIndexControl.Text = 9} } }) #================================================ # CustomImageControl #================================================ $CustomImageControl.add_SelectionChanged({ if ($CustomImageControl.SelectedIndex -eq 0) { SetDefaultValues } else { $OperatingSystemLabel.Content = "Image Name" $OperatingSystemLabel.Width = "150" $OSBuildControl.Visibility = "Collapsed" $OSEditionControl.Visibility = "Collapsed" $OSLanguageControl.Visibility = "Collapsed" $OSLicenseControl.Visibility = "Collapsed" $ImageIndexControl.IsEnabled = $true $ImageIndexControl.Text = 1 $GetWindowsImageControl.Visibility = "Visible" $GetWindowsImageControl.Items.Clear() $GetWindowsImageControl.IsEnabled = $true $GetWindowsImageOptions = Get-WindowsImage -ImagePath $CustomImageControl.SelectedValue $GetWindowsImageOptions | ForEach-Object { $GetWindowsImageControl.Items.Add($_.ImageName) | Out-Null } $GetWindowsImageControl.SelectedIndex = 0 } }) $GetWindowsImageControl.add_SelectionChanged({ $ImageIndexControl.Text = $GetWindowsImageControl.SelectedIndex + 1 if ($ImageIndexControl.Text -eq 0) {$ImageIndexControl.Text = 1} }) #================================================ # StartButtonControl #================================================ $StartButtonControl.add_Click({ $Global:XamlWindow.Close() Show-PowershellWindow #================================================ # Variables #================================================ $OSImageIndex = $ImageIndexControl.Text $OSBuild = $OSBuildControl.SelectedItem $OSEdition = $OSEditionControl.SelectedItem $OSLanguage = $OSLanguageControl.SelectedItem $OSLicense = $OSLicenseControl.SelectedItem #================================================ # AutopilotJson #================================================ $AutopilotJsonName = $AutopilotJsonControl.SelectedValue if ($AutopilotJsonName) { $AutopilotJsonItem = $AutopilotJsonChildItem | Where-Object {$_.FullName -eq "$AutopilotJsonName"} } else { $SkipAutopilot = $true $AutopilotJsonName = $null $AutopilotJsonItem = $null } if ($AutopilotJsonItem) { $AutopilotJsonObject = Get-Content -Raw $AutopilotJsonItem.FullName | ConvertFrom-Json $SkipAutopilot = $false } else { $SkipAutopilot = $true $AutopilotJsonObject = $null } #================================================ # OOBEDeployJson #================================================ $OOBEDeployJsonName = $OOBEDeployControl.SelectedValue if ($OOBEDeployJsonName) { $OOBEDeployJsonItem = $OOBEDeployJsonChildItem | Where-Object {$_.FullName -eq "$OOBEDeployJsonName"} } else { $SkipOOBEDeploy = $true $OOBEDeployJsonName = $null $OOBEDeployJsonItem = $null } if ($OOBEDeployJsonItem) { $OOBEDeployJsonObject = Get-Content -Raw $OOBEDeployJsonItem.FullName | ConvertFrom-Json $SkipOOBEDeploy = $false } else { $SkipOOBEDeploy = $true $OOBEDeployJsonObject = $null } #================================================ # AutopilotOOBEJson #================================================ $AutopilotOOBEJsonName = $AutopilotOOBEControl.SelectedValue if ($AutopilotOOBEJsonName) { $AutopilotOOBEJsonItem = $AutopilotOOBEJsonChildItem | Where-Object {$_.FullName -eq "$AutopilotOOBEJsonName"} } else { $SkipAutopilotOOBE = $true $AutopilotOOBEJsonName = $null $AutopilotOOBEJsonItem = $null } if ($AutopilotOOBEJsonItem) { $AutopilotOOBEJsonObject = Get-Content -Raw $AutopilotOOBEJsonItem.FullName | ConvertFrom-Json $SkipAutopilotOOBE = $false } else { $SkipAutopilotOOBE = $true $AutopilotOOBEJsonObject = $null } #================================================ # ImageFile #================================================ $ImageFileFullName = $CustomImageControl.SelectedValue if ($ImageFileFullName) { $ImageFileItem = $CustomImageChildItem | Where-Object {$_.FullName -eq "$ImageFileFullName"} $ImageFileName = Split-Path -Path $ImageFileItem.FullName -Leaf $OSBuild = $null $OSEdition = $null $OSLanguage = $null $OSLicense = $null } else { $ImageFileItem = $null $ImageFileFullName = $null $ImageFileName = $null } #================================================ # Global Variables #================================================ $Global:StartOSDCloudGUI = $null $Global:StartOSDCloudGUI = [ordered]@{ AutopilotJsonChildItem = $AutopilotJsonChildItem AutopilotJsonItem = $AutopilotJsonItem AutopilotJsonName = $AutopilotJsonName AutopilotJsonObject = $AutopilotJsonObject AutopilotOOBEJsonChildItem = $AutopilotOOBEJsonChildItem AutopilotOOBEJsonItem = $AutopilotOOBEJsonItem AutopilotOOBEJsonName = $AutopilotOOBEJsonName AutopilotOOBEJsonObject = $AutopilotOOBEJsonObject ImageFileFullName = $ImageFileFullName ImageFileItem = $ImageFileItem ImageFileName = $ImageFileName Manufacturer = $CSManufacturerControl.Text OOBEDeployJsonChildItem = $OOBEDeployJsonChildItem OOBEDeployJsonItem = $OOBEDeployJsonItem OOBEDeployJsonName = $OOBEDeployJsonName OOBEDeployJsonObject = $OOBEDeployJsonObject OSBuild = $OSBuild OSEdition = $OSEdition OSImageIndex = $OSImageIndex OSLanguage = $OSLanguage OSLicense = $OSLicense Product = $CSProductControl.Text Restart = $RestartCheckbox.IsChecked SkipAutopilot = $SkipAutopilot SkipAutopilotOOBE = $SkipAutopilotOOBE SkipODT = $true SkipOOBEDeploy = $SkipOOBEDeploy ZTI = $ZTICheckbox.IsChecked } #$Global:StartOSDCloudGUI | Out-Host if ($ScreenshotCheckbox.IsChecked) { $Params = @{ Screenshot = $true } Start-OSDCloud @Params } else { Start-OSDCloud } }) #================================================ # Customizations #================================================ [string]$ModuleVersion = Get-Module -Name OSD | Sort-Object -Property Version | Select-Object -ExpandProperty Version -Last 1 $Global:XamlWindow.Title = "$ModuleVersion OSDCloudGUI" #================================================ # Branding #================================================ if ($Global:OSDCloudGuiBranding) { $BrandingTitleControl.Content = $Global:OSDCloudGuiBranding.Title $BrandingTitleControl.Foreground = $Global:OSDCloudGuiBranding.Color } #================================================ # Launch #================================================ #$Global:XamlWindow | Out-Host $Global:XamlWindow.ShowDialog() | Out-Null #================================================ |