# Interactive Machine Setup Script with Main Menu # Printer Installation Function function Install-NetworkPrinter { param( [string]$PrinterName, [string]$PrinterIP, [bool]$SetAsDefault = $false ) Write-Host "Installing printer: $PrinterName" -ForegroundColor Cyan try { # Create port name $portName = "IP_$PrinterIP" # Check if port already exists $portExists = Get-PrinterPort -Name $portName -ErrorAction SilentlyContinue if (-not $portExists) { Write-Host " Creating printer port..." -ForegroundColor Gray Add-PrinterPort -Name $portName -PrinterHostAddress $PrinterIP -ErrorAction Stop } else { Write-Host " Printer port already exists" -ForegroundColor Gray } # Try to auto-detect and install printer driver Write-Host " Attempting to auto-detect printer..." -ForegroundColor Gray # Add the printer using the port try { Add-Printer -Name $PrinterName -PortName $portName -ErrorAction Stop Write-Host " ✓ Printer installed with auto-detected driver" -ForegroundColor Green } catch { # If auto-detection fails, try with generic driver Write-Host " Auto-detection failed, trying with generic driver..." -ForegroundColor Yellow # Use generic PostScript or PCL driver $genericDriver = Get-PrinterDriver -Name "*PS*" -ErrorAction SilentlyContinue | Select-Object -First 1 if (-not $genericDriver) { $genericDriver = Get-PrinterDriver -Name "*PCL*" -ErrorAction SilentlyContinue | Select-Object -First 1 } if ($genericDriver) { Add-Printer -Name $PrinterName -DriverName $genericDriver.Name -PortName $portName -ErrorAction Stop Write-Host " ✓ Printer installed with generic driver: $($genericDriver.Name)" -ForegroundColor Green } else { throw "No suitable driver found. Please install manually." } } # Set as default if requested if ($SetAsDefault) { Write-Host " Setting as default printer..." -ForegroundColor Gray $printer = Get-Printer -Name $PrinterName -ErrorAction Stop Set-Printer -Name $PrinterName -ErrorAction Stop (New-Object -ComObject WScript.Network).SetDefaultPrinter($PrinterName) Write-Host " ✓ Set as default printer" -ForegroundColor Green } Write-Host " ✓ Printer '$PrinterName' installed successfully" -ForegroundColor Green Write-Host " IP: $PrinterIP" -ForegroundColor Gray return $true } catch { Write-Warning " ✗ Failed to install printer '$PrinterName': $_" Write-Host " You may need to install the printer driver manually" -ForegroundColor Yellow return $false } } # Function to create user account function Create-UserAccount { Write-Host "" Write-Host "=== Create User Account ===" -ForegroundColor Yellow Write-Host "Enter Username:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $UserName = Read-Host Write-Host "Enter Password:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $UserPassword = Read-Host -AsSecureString $UserPasswordPlain = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($UserPassword)) Write-Host "Make this user an Administrator? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $MakeAdmin = Read-Host $IsAdministrator = ($MakeAdmin -eq "Y" -or $MakeAdmin -eq "y") try { $SecurePassword = ConvertTo-SecureString $UserPasswordPlain -AsPlainText -Force New-LocalUser -Name $UserName -Password $SecurePassword -Description "$(if($IsAdministrator){'Administrator account'}else{'Standard user account'})" -ErrorAction Stop if ($IsAdministrator) { Add-LocalGroupMember -Group "Administrators" -Member $UserName -ErrorAction Stop Write-Host "✓ Administrator account '$UserName' created successfully" -ForegroundColor Green } else { Add-LocalGroupMember -Group "Users" -Member $UserName -ErrorAction Stop Write-Host "✓ Standard user account '$UserName' created successfully" -ForegroundColor Green } } catch { Write-Warning "Failed to create user account: $_" } Write-Host "" Write-Host "Press any key to return to main menu..." -ForegroundColor Gray $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") } # Function to install software function Install-Software { Write-Host "" Write-Host "=== Install Software ===" -ForegroundColor Yellow Write-Host "Select software to install (separate numbers with spaces, e.g., 1 2 3):" -ForegroundColor Yellow Write-Host "1. Google Chrome" Write-Host "2. Mozilla Firefox" Write-Host "3. VLC Media Player" Write-Host "4. 7-Zip" Write-Host "5. Notepad++" Write-Host "6. Adobe Acrobat" Write-Host "7. Microsoft Office" Write-Host "8. RustDesk (Remote Desktop)" Write-Host "9. Dropbox" Write-Host "10. 1Password" Write-Host "11. Docker Desktop" Write-Host "12. TeamViewer" Write-Host "13. All of the above" Write-Host "14. Cancel" Write-Host "Enter your choices:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $SoftwareChoice = Read-Host $SoftwareList = @() if ($SoftwareChoice -match "\b13\b") { $SoftwareList = @("Google.Chrome", "Mozilla.Firefox", "VideoLAN.VLC", "7zip.7zip", "Notepad++.Notepad++", "Adobe.Acrobat.DC", "Microsoft.Office", "RustDesk.RustDesk", "Dropbox.Dropbox", "AgileBits.1Password", "Docker.DockerDesktop", "TeamViewer.TeamViewer") } elseif ($SoftwareChoice -notmatch "\b14\b") { if ($SoftwareChoice -match "\b1\b") { $SoftwareList += "Google.Chrome" } if ($SoftwareChoice -match "\b2\b") { $SoftwareList += "Mozilla.Firefox" } if ($SoftwareChoice -match "\b3\b") { $SoftwareList += "VideoLAN.VLC" } if ($SoftwareChoice -match "\b4\b") { $SoftwareList += "7zip.7zip" } if ($SoftwareChoice -match "\b5\b") { $SoftwareList += "Notepad++.Notepad++" } if ($SoftwareChoice -match "\b6\b") { $SoftwareList += "Adobe.Acrobat.DC" } if ($SoftwareChoice -match "\b7\b") { $SoftwareList += "Microsoft.Office" } if ($SoftwareChoice -match "\b8\b") { $SoftwareList += "RustDesk.RustDesk" } if ($SoftwareChoice -match "\b9\b") { $SoftwareList += "Dropbox.Dropbox" } if ($SoftwareChoice -match "\b10\b") { $SoftwareList += "AgileBits.1Password" } if ($SoftwareChoice -match "\b11\b") { $SoftwareList += "Docker.DockerDesktop" } if ($SoftwareChoice -match "\b12\b") { $SoftwareList += "TeamViewer.TeamViewer" } } if ($SoftwareList.Count -gt 0) { Write-Host "" Write-Host "Installing software packages..." -ForegroundColor Yellow foreach ($app in $SoftwareList) { Write-Host "Installing: $app" -ForegroundColor Cyan try { winget install --silent --accept-package-agreements --accept-source-agreements $app Write-Host " ✓ $app installed" -ForegroundColor Green } catch { Write-Warning " ✗ Failed to install $app : $_" } } Write-Host "" Write-Host "✓ Software installation complete!" -ForegroundColor Green } Write-Host "" Write-Host "Press any key to return to main menu..." -ForegroundColor Gray $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") } # Function to configure network printers function Configure-NetworkPrinters { Write-Host "" Write-Host "=== Configure Network Printers ===" -ForegroundColor Yellow $continuePrinters = $true while ($continuePrinters) { Write-Host "" Write-Host "1. Add a network printer" Write-Host "2. View installed printers" Write-Host "3. Remove a printer" Write-Host "4. Return to main menu" Write-Host "" Write-Host "Select option:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $printerChoice = Read-Host switch ($printerChoice) { "1" { Write-Host "" Write-Host "--- Add Network Printer ---" -ForegroundColor Yellow Write-Host "Enter printer name (e.g., Office Printer):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $PrinterName = Read-Host Write-Host "Enter printer IP address (e.g., 192.168.1.100):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $PrinterIP = Read-Host Write-Host "Set as default printer? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $SetDefault = Read-Host $setAsDefault = ($SetDefault -eq "Y" -or $SetDefault -eq "y") Install-NetworkPrinter -PrinterName $PrinterName -PrinterIP $PrinterIP -SetAsDefault $setAsDefault } "2" { Write-Host "" Write-Host "--- Installed Printers ---" -ForegroundColor Yellow $printers = Get-Printer | Select-Object Name, DriverName, PortName if ($printers.Count -gt 0) { foreach ($printer in $printers) { Write-Host " • $($printer.Name)" -ForegroundColor Cyan Write-Host " Driver: $($printer.DriverName)" -ForegroundColor Gray Write-Host " Port: $($printer.PortName)" -ForegroundColor Gray } } else { Write-Host "No printers installed." -ForegroundColor Gray } } "3" { Write-Host "" Write-Host "--- Remove Printer ---" -ForegroundColor Yellow $printers = Get-Printer if ($printers.Count -gt 0) { for ($i = 0; $i -lt $printers.Count; $i++) { Write-Host " $($i + 1). $($printers[$i].Name)" -ForegroundColor Cyan } Write-Host "" Write-Host "Enter printer number to remove (or 0 to cancel):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $removeIndex = Read-Host $removeNum = [int]$removeIndex if ($removeNum -gt 0 -and $removeNum -le $printers.Count) { $printerToRemove = $printers[$removeNum - 1] try { Remove-Printer -Name $printerToRemove.Name -ErrorAction Stop Write-Host "✓ Printer '$($printerToRemove.Name)' removed successfully" -ForegroundColor Green } catch { Write-Warning "Failed to remove printer: $_" } } elseif ($removeNum -ne 0) { Write-Host "Invalid selection." -ForegroundColor Red } } else { Write-Host "No printers to remove." -ForegroundColor Gray } } "4" { $continuePrinters = $false } default { Write-Host "Invalid option. Please select 1-4." -ForegroundColor Red } } } } # Function to configure network shares function Configure-NetworkShares { Write-Host "" Write-Host "=== Configure Network Shares ===" -ForegroundColor Yellow $continueShares = $true while ($continueShares) { Write-Host "" Write-Host "1. Create a new network share" Write-Host "2. View existing shares" Write-Host "3. Remove a share" Write-Host "4. Return to main menu" Write-Host "" Write-Host "Select option:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $shareChoice = Read-Host switch ($shareChoice) { "1" { Write-Host "" Write-Host "--- Create Network Share ---" -ForegroundColor Yellow Write-Host "Enter share name (e.g., SharedFiles):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $ShareName = Read-Host Write-Host "Enter folder path (e.g., C:\Shares\SharedFiles):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $FolderPath = Read-Host Write-Host "Enter share description (optional):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $ShareDescription = Read-Host Write-Host "Access level - 1=Read Only, 2=Full Access, 3=Change:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $AccessChoice = Read-Host try { # Create folder if it doesn't exist if (!(Test-Path -Path $FolderPath)) { New-Item -Path $FolderPath -ItemType Directory -Force | Out-Null Write-Host " Created folder: $FolderPath" -ForegroundColor Green } # Remove existing share if it exists $existingShare = Get-SmbShare -Name $ShareName -ErrorAction SilentlyContinue if ($existingShare) { Remove-SmbShare -Name $ShareName -Force Write-Host " Removed existing share with same name" -ForegroundColor Yellow } # Create the share $smbParams = @{ Name = $ShareName Path = $FolderPath ErrorAction = 'Stop' } if ($ShareDescription) { $smbParams.Description = $ShareDescription } switch ($AccessChoice) { "1" { $smbParams.ReadAccess = "Everyone" $permission = "ReadAndExecute" } "3" { $smbParams.ChangeAccess = "Everyone" $permission = "Modify" } default { $smbParams.FullAccess = "Everyone" $permission = "FullControl" } } New-SmbShare @smbParams | Out-Null # Set NTFS permissions $acl = Get-Acl $FolderPath $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Everyone", $permission, "ContainerInherit,ObjectInherit", "None", "Allow") $acl.SetAccessRule($accessRule) Set-Acl -Path $FolderPath -AclObject $acl Write-Host "✓ Share '$ShareName' created successfully" -ForegroundColor Green Write-Host " Network path: \\$env:COMPUTERNAME\$ShareName" -ForegroundColor Gray } catch { Write-Warning "Failed to create share: $_" } } "2" { Write-Host "" Write-Host "--- Existing Network Shares ---" -ForegroundColor Yellow $shares = Get-SmbShare | Where-Object { $_.Special -eq $false } if ($shares.Count -gt 0) { foreach ($share in $shares) { Write-Host " • $($share.Name)" -ForegroundColor Cyan Write-Host " Path: $($share.Path)" -ForegroundColor Gray if ($share.Description) { Write-Host " Description: $($share.Description)" -ForegroundColor Gray } Write-Host " Network path: \\$env:COMPUTERNAME\$($share.Name)" -ForegroundColor Gray } } else { Write-Host "No custom shares found." -ForegroundColor Gray } } "3" { Write-Host "" Write-Host "--- Remove Network Share ---" -ForegroundColor Yellow $shares = Get-SmbShare | Where-Object { $_.Special -eq $false } if ($shares.Count -gt 0) { for ($i = 0; $i -lt $shares.Count; $i++) { Write-Host " $($i + 1). $($shares[$i].Name) - $($shares[$i].Path)" -ForegroundColor Cyan } Write-Host "" Write-Host "Enter share number to remove (or 0 to cancel):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $removeIndex = Read-Host $removeNum = [int]$removeIndex if ($removeNum -gt 0 -and $removeNum -le $shares.Count) { $shareToRemove = $shares[$removeNum - 1] try { Remove-SmbShare -Name $shareToRemove.Name -Force -ErrorAction Stop Write-Host "✓ Share '$($shareToRemove.Name)' removed successfully" -ForegroundColor Green } catch { Write-Warning "Failed to remove share: $_" } } elseif ($removeNum -ne 0) { Write-Host "Invalid selection." -ForegroundColor Red } } else { Write-Host "No shares to remove." -ForegroundColor Gray } } "4" { $continueShares = $false } default { Write-Host "Invalid option. Please select 1-4." -ForegroundColor Red } } } } # Function to enable OpenSSH Server function Enable-OpenSSHServer { Write-Host "" Write-Host "=== Enable OpenSSH Server ===" -ForegroundColor Yellow try { # Check if OpenSSH Server is already installed $sshServer = Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*' if ($sshServer.State -eq "Installed") { Write-Host "OpenSSH Server is already installed." -ForegroundColor Green } else { Write-Host "Installing OpenSSH Server..." -ForegroundColor Yellow Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 Write-Host "✓ OpenSSH Server installed successfully" -ForegroundColor Green } # Check if SSH service is running $sshService = Get-Service -Name sshd -ErrorAction SilentlyContinue if ($sshService.Status -ne "Running") { Write-Host "Starting OpenSSH Server service..." -ForegroundColor Yellow Start-Service sshd Write-Host "✓ OpenSSH Server service started" -ForegroundColor Green } else { Write-Host "OpenSSH Server service is already running." -ForegroundColor Green } # Ensure service is set to automatic startup if ($sshService.StartType -ne "Automatic") { Write-Host "Setting service to start automatically..." -ForegroundColor Yellow Set-Service -Name sshd -StartupType 'Automatic' Write-Host "✓ Service set to automatic startup" -ForegroundColor Green } else { Write-Host "Service is already set to automatic startup." -ForegroundColor Green } # Configure firewall rule Write-Host "Checking firewall configuration..." -ForegroundColor Yellow $firewallRule = Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue if (!$firewallRule) { New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 Write-Host "✓ Firewall rule created" -ForegroundColor Green } else { Write-Host "✓ Firewall rule already exists" -ForegroundColor Green } # Check current default shell configuration Write-Host "Checking SSH default shell configuration..." -ForegroundColor Yellow $currentShell = Get-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -ErrorAction SilentlyContinue $powerShellPath = (Get-Command powershell.exe).Source if ($currentShell -and $currentShell.DefaultShell -eq $powerShellPath) { Write-Host "✓ PowerShell is already set as default SSH shell" -ForegroundColor Green } else { if ($currentShell) { Write-Host "Current default shell: $($currentShell.DefaultShell)" -ForegroundColor Gray } else { Write-Host "Current default shell: cmd.exe (Windows default)" -ForegroundColor Gray } Write-Host "Setting PowerShell as default SSH shell..." -ForegroundColor Yellow # Create the OpenSSH registry key if it doesn't exist if (!(Test-Path "HKLM:\SOFTWARE\OpenSSH")) { New-Item -Path "HKLM:\SOFTWARE\OpenSSH" -Force | Out-Null } New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value $powerShellPath -PropertyType String -Force | Out-Null Write-Host "✓ PowerShell set as default SSH shell" -ForegroundColor Green # Restart SSH service to apply changes Write-Host "Restarting SSH service to apply changes..." -ForegroundColor Yellow Restart-Service sshd -ErrorAction Stop Write-Host "✓ SSH service restarted" -ForegroundColor Green } Write-Host "" Write-Host "✓ OpenSSH Server setup complete!" -ForegroundColor Green Write-Host " Status: Running" -ForegroundColor Gray Write-Host " Startup: Automatic" -ForegroundColor Gray Write-Host " Default Shell: PowerShell" -ForegroundColor Gray Write-Host " Firewall: Configured" -ForegroundColor Gray Write-Host "" Write-Host " You can connect using: ssh $env:USERNAME@$env:COMPUTERNAME" -ForegroundColor Gray Write-Host " Note: SSH users in the Administrators group will have admin rights" -ForegroundColor Gray } catch { Write-Warning "Failed to enable OpenSSH Server: $_" } Write-Host "" Write-Host "Press any key to return to main menu..." -ForegroundColor Gray $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") } # Function to install WSL function Install-WSL { Write-Host "" Write-Host "=== Install WSL (Windows Subsystem for Linux) ===" -ForegroundColor Yellow try { # Check if WSL is already installed $wslVersion = wsl --version 2>$null if ($LASTEXITCODE -eq 0) { Write-Host "WSL is already installed." -ForegroundColor Green Write-Host "" wsl --version Write-Host "" # List installed distributions Write-Host "Installed Linux distributions:" -ForegroundColor Yellow wsl --list --verbose Write-Host "" Write-Host "Would you like to install an additional distribution? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $installDistro = Read-Host if ($installDistro -eq "Y" -or $installDistro -eq "y") { Write-Host "" Write-Host "Select a distribution to install:" -ForegroundColor Yellow Write-Host "1. Ubuntu (latest)" Write-Host "2. Ubuntu 22.04 LTS" Write-Host "3. Ubuntu 20.04 LTS" Write-Host "4. Debian" Write-Host "5. Kali Linux" Write-Host "6. openSUSE Leap" Write-Host "7. Cancel" Write-Host "" Write-Host "Enter your choice:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $distroChoice = Read-Host $distroName = "" switch ($distroChoice) { "1" { $distroName = "Ubuntu" } "2" { $distroName = "Ubuntu-22.04" } "3" { $distroName = "Ubuntu-20.04" } "4" { $distroName = "Debian" } "5" { $distroName = "kali-linux" } "6" { $distroName = "openSUSE-Leap-15.5" } "7" { Write-Host "Cancelled." -ForegroundColor Yellow Write-Host "" Write-Host "Press any key to return to main menu..." -ForegroundColor Gray $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") return } default { Write-Host "Invalid selection." -ForegroundColor Red Write-Host "" Write-Host "Press any key to return to main menu..." -ForegroundColor Gray $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") return } } Write-Host "" Write-Host "Installing $distroName..." -ForegroundColor Yellow wsl --install -d $distroName Write-Host "✓ $distroName installed successfully" -ForegroundColor Green Write-Host " You can launch it by typing: wsl -d $distroName" -ForegroundColor Gray } } else { # WSL is not installed Write-Host "WSL is not installed. Installing..." -ForegroundColor Yellow Write-Host "" Write-Host "Select a distribution to install:" -ForegroundColor Yellow Write-Host "1. Ubuntu (latest) - Recommended" Write-Host "2. Ubuntu 22.04 LTS" Write-Host "3. Ubuntu 20.04 LTS" Write-Host "4. Debian" Write-Host "5. Kali Linux" Write-Host "6. openSUSE Leap" Write-Host "7. Install WSL without a distribution" Write-Host "" Write-Host "Enter your choice:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $distroChoice = Read-Host if ($distroChoice -eq "7") { Write-Host "" Write-Host "Installing WSL without distribution..." -ForegroundColor Yellow wsl --install --no-distribution Write-Host "✓ WSL installed successfully" -ForegroundColor Green Write-Host " You can install a distribution later using: wsl --install -d " -ForegroundColor Gray Write-Host " List available distributions: wsl --list --online" -ForegroundColor Gray } else { $distroName = "" switch ($distroChoice) { "1" { $distroName = "Ubuntu" } "2" { $distroName = "Ubuntu-22.04" } "3" { $distroName = "Ubuntu-20.04" } "4" { $distroName = "Debian" } "5" { $distroName = "kali-linux" } "6" { $distroName = "openSUSE-Leap-15.5" } default { Write-Host "Invalid selection. Installing WSL with default Ubuntu..." -ForegroundColor Yellow $distroName = "Ubuntu" } } Write-Host "" Write-Host "Installing WSL with $distroName..." -ForegroundColor Yellow Write-Host "This may take several minutes..." -ForegroundColor Gray wsl --install -d $distroName Write-Host "✓ WSL and $distroName installed successfully" -ForegroundColor Green } Write-Host "" Write-Host "IMPORTANT: A system restart is required to complete WSL installation." -ForegroundColor Yellow Write-Host "After restart, launch your Linux distribution to complete setup." -ForegroundColor Yellow } } catch { Write-Warning "Failed to install WSL: $_" Write-Host "" Write-Host "Note: WSL installation requires Windows 10 version 2004 or higher, or Windows 11." -ForegroundColor Yellow } Write-Host "" Write-Host "Press any key to return to main menu..." -ForegroundColor Gray $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") } # Function for full setup function Full-Setup { Write-Host "" Write-Host "=== Full Machine Setup ===" -ForegroundColor Green Write-Host "" # Computer Name Write-Host "Enter Computer Name:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $ComputerName = Read-Host # User Account Write-Host "Enter Username for new account:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $UserName = Read-Host Write-Host "Enter Password for $UserName :" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $UserPassword = Read-Host -AsSecureString $UserPasswordPlain = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($UserPassword)) # User Account Type Write-Host "Make $UserName an Administrator? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $MakeAdmin = Read-Host $IsAdministrator = ($MakeAdmin -eq "Y" -or $MakeAdmin -eq "y") # Network Share Setup $NetworkShares = @() $continueShares = $true Write-Host "Configure network shares? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $ConfigureShares = Read-Host if ($ConfigureShares -eq "Y" -or $ConfigureShares -eq "y") { while ($continueShares) { Write-Host "" Write-Host "=== Network Share Configuration Menu ===" -ForegroundColor Yellow Write-Host "1. Add a network share" Write-Host "2. Review configured shares" Write-Host "3. Remove a share from list" Write-Host "4. Continue with setup" Write-Host "" Write-Host "Select option:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $shareMenuChoice = Read-Host switch ($shareMenuChoice) { "1" { # Add share Write-Host "" Write-Host "--- Add Network Share ---" -ForegroundColor Yellow Write-Host "Enter share name (e.g., SharedFiles):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $ShareName = Read-Host Write-Host "Enter folder path (e.g., C:\Shares\SharedFiles):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $FolderPath = Read-Host Write-Host "Enter share description (optional):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $ShareDescription = Read-Host Write-Host "Access level - 1=Read Only, 2=Full Access, 3=Custom:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $AccessChoice = Read-Host $AccessLevel = "Full" switch ($AccessChoice) { "1" { $AccessLevel = "Read" } "2" { $AccessLevel = "Full" } "3" { $AccessLevel = "Custom" } } $NetworkShares += @{ Name = $ShareName Path = $FolderPath Description = $ShareDescription Access = $AccessLevel } Write-Host "✓ Share '$ShareName' added to configuration list" -ForegroundColor Green } "2" { # Review shares Write-Host "" if ($NetworkShares.Count -eq 0) { Write-Host "No shares configured yet." -ForegroundColor Yellow } else { Write-Host "--- Configured Shares ---" -ForegroundColor Yellow for ($i = 0; $i -lt $NetworkShares.Count; $i++) { $share = $NetworkShares[$i] Write-Host " $($i + 1). $($share.Name)" -ForegroundColor Cyan Write-Host " Path: $($share.Path)" -ForegroundColor Gray Write-Host " Access: $($share.Access)" -ForegroundColor Gray if ($share.Description) { Write-Host " Description: $($share.Description)" -ForegroundColor Gray } } } } "3" { # Remove share Write-Host "" if ($NetworkShares.Count -eq 0) { Write-Host "No shares to remove." -ForegroundColor Yellow } else { Write-Host "--- Remove Share ---" -ForegroundColor Yellow for ($i = 0; $i -lt $NetworkShares.Count; $i++) { Write-Host " $($i + 1). $($NetworkShares[$i].Name)" -ForegroundColor Cyan } Write-Host "" Write-Host "Enter share number to remove (or 0 to cancel):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $removeIndex = Read-Host $removeNum = [int]$removeIndex if ($removeNum -gt 0 -and $removeNum -le $NetworkShares.Count) { $removedShare = $NetworkShares[$removeNum - 1] $NetworkShares = $NetworkShares | Where-Object { $_ -ne $removedShare } Write-Host "✓ Removed '$($removedShare.Name)' from configuration" -ForegroundColor Green } elseif ($removeNum -ne 0) { Write-Host "Invalid selection." -ForegroundColor Red } } } "4" { # Continue $continueShares = $false } default { Write-Host "Invalid option. Please select 1-4." -ForegroundColor Red } } } } # Network Printer Setup $NetworkPrinters = @() $continuePrinters = $true Write-Host "Configure network printers? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $ConfigurePrinters = Read-Host if ($ConfigurePrinters -eq "Y" -or $ConfigurePrinters -eq "y") { while ($continuePrinters) { Write-Host "" Write-Host "=== Printer Configuration Menu ===" -ForegroundColor Yellow Write-Host "1. Add a network printer" Write-Host "2. Review configured printers" Write-Host "3. Remove a printer from list" Write-Host "4. Continue with setup" Write-Host "" Write-Host "Select option:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $printerMenuChoice = Read-Host switch ($printerMenuChoice) { "1" { # Add printer Write-Host "" Write-Host "--- Add Network Printer ---" -ForegroundColor Yellow Write-Host "Enter printer name (e.g., Office Printer):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $PrinterName = Read-Host Write-Host "Enter printer IP address or hostname (e.g., 192.168.1.100):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $PrinterIP = Read-Host Write-Host "Set as default printer? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $SetDefault = Read-Host $NetworkPrinters += @{ Name = $PrinterName IP = $PrinterIP SetDefault = ($SetDefault -eq "Y" -or $SetDefault -eq "y") } Write-Host "✓ Printer '$PrinterName' added to configuration list" -ForegroundColor Green } "2" { # Review printers Write-Host "" if ($NetworkPrinters.Count -eq 0) { Write-Host "No printers configured yet." -ForegroundColor Yellow } else { Write-Host "--- Configured Printers ---" -ForegroundColor Yellow for ($i = 0; $i -lt $NetworkPrinters.Count; $i++) { $printer = $NetworkPrinters[$i] Write-Host " $($i + 1). $($printer.Name)" -ForegroundColor Cyan Write-Host " IP: $($printer.IP)" -ForegroundColor Gray Write-Host " Default: $(if($printer.SetDefault){'Yes'}else{'No'})" -ForegroundColor Gray } } } "3" { # Remove printer Write-Host "" if ($NetworkPrinters.Count -eq 0) { Write-Host "No printers to remove." -ForegroundColor Yellow } else { Write-Host "--- Remove Printer ---" -ForegroundColor Yellow for ($i = 0; $i -lt $NetworkPrinters.Count; $i++) { Write-Host " $($i + 1). $($NetworkPrinters[$i].Name)" -ForegroundColor Cyan } Write-Host "" Write-Host "Enter printer number to remove (or 0 to cancel):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $removeIndex = Read-Host $removeNum = [int]$removeIndex if ($removeNum -gt 0 -and $removeNum -le $NetworkPrinters.Count) { $removedPrinter = $NetworkPrinters[$removeNum - 1] $NetworkPrinters = $NetworkPrinters | Where-Object { $_ -ne $removedPrinter } Write-Host "✓ Removed '$($removedPrinter.Name)' from configuration" -ForegroundColor Green } elseif ($removeNum -ne 0) { Write-Host "Invalid selection." -ForegroundColor Red } } } "4" { # Continue $continuePrinters = $false } default { Write-Host "Invalid option. Please select 1-4." -ForegroundColor Red } } } } # WiFi Setup Write-Host "Setup WiFi? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $SetupWiFi = Read-Host $WiFiSSID = "" $WiFiPasswordPlain = "" $WiFiSecurity = "WPA2PSK" if ($SetupWiFi -eq "Y" -or $SetupWiFi -eq "y") { Write-Host "Enter WiFi SSID:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $WiFiSSID = Read-Host Write-Host "Enter WiFi Password:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $WiFiPassword = Read-Host -AsSecureString $WiFiPasswordPlain = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($WiFiPassword)) Write-Host "WiFi Security Type (1=WPA2PSK, 2=WPA3PSK, 3=Open):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $SecurityChoice = Read-Host switch ($SecurityChoice) { "2" { $WiFiSecurity = "WPA3PSK" } "3" { $WiFiSecurity = "Open" } default { $WiFiSecurity = "WPA2PSK" } } } # Static IP Configuration Write-Host "Configure static IP address? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $ConfigureStaticIP = Read-Host $StaticIPConfig = $null if ($ConfigureStaticIP -eq "Y" -or $ConfigureStaticIP -eq "y") { Write-Host "" Write-Host "--- Static IP Configuration ---" -ForegroundColor Yellow # Get available network adapters $adapters = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } if ($adapters.Count -eq 0) { Write-Warning "No active network adapters found. Static IP configuration will be skipped." } else { Write-Host "Available network adapters:" -ForegroundColor Yellow for ($i = 0; $i -lt $adapters.Count; $i++) { Write-Host " $($i + 1). $($adapters[$i].Name) - $($adapters[$i].InterfaceDescription)" -ForegroundColor Cyan } Write-Host "Select adapter number:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $adapterChoice = Read-Host $adapterIndex = [int]$adapterChoice - 1 if ($adapterIndex -ge 0 -and $adapterIndex -lt $adapters.Count) { $selectedAdapter = $adapters[$adapterIndex] Write-Host "Enter IP address (e.g., 192.168.1.100):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $IPAddress = Read-Host Write-Host "Enter subnet mask prefix length (e.g., 24 for 255.255.255.0):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $PrefixLength = Read-Host Write-Host "Enter default gateway (e.g., 192.168.1.1):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $Gateway = Read-Host Write-Host "Enter primary DNS server (e.g., 8.8.8.8):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $DNS1 = Read-Host Write-Host "Enter secondary DNS server (optional, press Enter to skip):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $DNS2 = Read-Host $StaticIPConfig = @{ AdapterName = $selectedAdapter.Name IPAddress = $IPAddress PrefixLength = $PrefixLength Gateway = $Gateway DNS1 = $DNS1 DNS2 = $DNS2 } Write-Host "✓ Static IP configuration saved" -ForegroundColor Green } else { Write-Warning "Invalid adapter selection. Static IP configuration skipped." } } } # Software Selection Write-Host "" Write-Host "Select software to install (separate numbers with spaces, e.g., 1 2 3):" -ForegroundColor Yellow Write-Host "1. Google Chrome" Write-Host "2. Mozilla Firefox" Write-Host "3. VLC Media Player" Write-Host "4. 7-Zip" Write-Host "5. Notepad++" Write-Host "6. Adobe Acrobat" Write-Host "7. Microsoft Office" Write-Host "8. RustDesk (Remote Desktop)" Write-Host "9. Dropbox" Write-Host "10. 1Password" Write-Host "11. Docker Desktop" Write-Host "12. TeamViewer" Write-Host "13. All of the above" Write-Host "14. None (skip software installation)" Write-Host "Enter your choices:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $SoftwareChoice = Read-Host $SoftwareList = @() if ($SoftwareChoice -match "\b13\b") { $SoftwareList = @("Google.Chrome", "Mozilla.Firefox", "VideoLAN.VLC", "7zip.7zip", "Notepad++.Notepad++", "Adobe.Acrobat.DC", "Microsoft.Office", "RustDesk.RustDesk", "Dropbox.Dropbox", "AgileBits.1Password", "Docker.DockerDesktop", "TeamViewer.TeamViewer") } elseif ($SoftwareChoice -notmatch "\b14\b") { if ($SoftwareChoice -match "\b1\b") { $SoftwareList += "Google.Chrome" } if ($SoftwareChoice -match "\b2\b") { $SoftwareList += "Mozilla.Firefox" } if ($SoftwareChoice -match "\b3\b") { $SoftwareList += "VideoLAN.VLC" } if ($SoftwareChoice -match "\b4\b") { $SoftwareList += "7zip.7zip" } if ($SoftwareChoice -match "\b5\b") { $SoftwareList += "Notepad++.Notepad++" } if ($SoftwareChoice -match "\b6\b") { $SoftwareList += "Adobe.Acrobat.DC" } if ($SoftwareChoice -match "\b7\b") { $SoftwareList += "Microsoft.Office" } if ($SoftwareChoice -match "\b8\b") { $SoftwareList += "RustDesk.RustDesk" } if ($SoftwareChoice -match "\b9\b") { $SoftwareList += "Dropbox.Dropbox" } if ($SoftwareChoice -match "\b10\b") { $SoftwareList += "AgileBits.1Password" } if ($SoftwareChoice -match "\b11\b") { $SoftwareList += "Docker.DockerDesktop" } if ($SoftwareChoice -match "\b12\b") { $SoftwareList += "TeamViewer.TeamViewer" } } # Domain Join Write-Host "Join a domain? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $JoinDomainChoice = Read-Host $JoinDomain = $false $DomainName = "" if ($JoinDomainChoice -eq "Y" -or $JoinDomainChoice -eq "y") { $JoinDomain = $true Write-Host "Enter Domain Name:" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $DomainName = Read-Host } # Summary Write-Host "" Write-Host "=== Setup Summary ===" -ForegroundColor Yellow Write-Host "Computer Name: $ComputerName" Write-Host "User Account: $UserName ($(if($IsAdministrator){'Administrator'}else{'Standard User'}))" if ($NetworkShares.Count -gt 0) { Write-Host "Network Shares: $($NetworkShares.Count) configured" } if ($NetworkPrinters.Count -gt 0) { Write-Host "Network Printers: $($NetworkPrinters.Count) configured" } Write-Host "WiFi SSID: $(if($WiFiSSID){$WiFiSSID}else{'Not configured'})" if ($StaticIPConfig) { Write-Host "Static IP: $($StaticIPConfig.IPAddress)/$($StaticIPConfig.PrefixLength) on $($StaticIPConfig.AdapterName)" } Write-Host "Software: $(if($SoftwareList.Count -gt 0){$SoftwareList.Count.ToString() + ' packages selected'}else{'None'})" Write-Host "Domain: $(if($JoinDomain){$DomainName}else{'Not joining'})" Write-Host "" Write-Host "Proceed with setup? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $Confirm = Read-Host if ($Confirm -ne "Y" -and $Confirm -ne "y") { Write-Host "Setup cancelled." -ForegroundColor Red return } Write-Host "" Write-Host "=== Starting Setup ===" -ForegroundColor Green Write-Host "" # 1. Setup WiFi if ($WiFiSSID) { Write-Host "Setting up WiFi connection: $WiFiSSID" -ForegroundColor Yellow $WiFiProfileXml = @" $WiFiSSID $WiFiSSID ESS auto $(if($WiFiSecurity -eq "Open"){"open"}else{"WPA2PSK"}) $(if($WiFiSecurity -eq "Open"){"none"}else{"AES"}) false $(if($WiFiSecurity -ne "Open"){ " passPhrase false $WiFiPasswordPlain " }) false "@ $TempProfile = "$env:TEMP\wifi_profile.xml" $WiFiProfileXml | Out-File -FilePath $TempProfile -Encoding UTF8 try { netsh wlan add profile filename="$TempProfile" | Out-Null netsh wlan connect name="$WiFiSSID" | Out-Null Remove-Item $TempProfile -Force Write-Host "WiFi setup complete. Waiting for connection..." -ForegroundColor Green Start-Sleep -Seconds 5 if (Test-NetConnection -ComputerName "8.8.8.8" -Port 53 -InformationLevel Quiet -WarningAction SilentlyContinue) { Write-Host "Internet connection established!" -ForegroundColor Green } else { Write-Warning "WiFi connected but no internet access detected" } } catch { Write-Warning "WiFi setup failed: $_" } } # 1b. Configure Static IP if ($StaticIPConfig) { Write-Host "Configuring static IP address..." -ForegroundColor Yellow try { $adapter = Get-NetAdapter -Name $StaticIPConfig.AdapterName -ErrorAction Stop # Remove existing IP configuration Write-Host " Removing existing IP configuration..." -ForegroundColor Gray Remove-NetIPAddress -InterfaceAlias $StaticIPConfig.AdapterName -Confirm:$false -ErrorAction SilentlyContinue Remove-NetRoute -InterfaceAlias $StaticIPConfig.AdapterName -Confirm:$false -ErrorAction SilentlyContinue # Set static IP address Write-Host " Setting IP address: $($StaticIPConfig.IPAddress)/$($StaticIPConfig.PrefixLength)" -ForegroundColor Gray New-NetIPAddress -InterfaceAlias $StaticIPConfig.AdapterName ` -IPAddress $StaticIPConfig.IPAddress ` -PrefixLength $StaticIPConfig.PrefixLength ` -DefaultGateway $StaticIPConfig.Gateway ` -ErrorAction Stop | Out-Null # Set DNS servers $dnsServers = @($StaticIPConfig.DNS1) if ($StaticIPConfig.DNS2) { $dnsServers += $StaticIPConfig.DNS2 } Write-Host " Setting DNS servers: $($dnsServers -join ', ')" -ForegroundColor Gray Set-DnsClientServerAddress -InterfaceAlias $StaticIPConfig.AdapterName ` -ServerAddresses $dnsServers ` -ErrorAction Stop Write-Host " ✓ Static IP configured successfully" -ForegroundColor Green Write-Host " IP: $($StaticIPConfig.IPAddress)/$($StaticIPConfig.PrefixLength)" -ForegroundColor Gray Write-Host " Gateway: $($StaticIPConfig.Gateway)" -ForegroundColor Gray Write-Host " DNS: $($dnsServers -join ', ')" -ForegroundColor Gray # Test connectivity Start-Sleep -Seconds 3 if (Test-NetConnection -ComputerName $StaticIPConfig.Gateway -InformationLevel Quiet -WarningAction SilentlyContinue) { Write-Host " ✓ Gateway is reachable" -ForegroundColor Green } else { Write-Warning " Gateway is not reachable. Please verify the configuration." } } catch { Write-Warning "Failed to configure static IP: $_" } } # 2. Rename computer Write-Host "Renaming computer to: $ComputerName" -ForegroundColor Yellow try { Rename-Computer -NewName $ComputerName -Force -ErrorAction Stop Write-Host "Computer renamed successfully" -ForegroundColor Green } catch { Write-Warning "Failed to rename computer: $_" } # 3. Create user account Write-Host "Creating user account: $UserName" -ForegroundColor Yellow try { $SecurePassword = ConvertTo-SecureString $UserPasswordPlain -AsPlainText -Force New-LocalUser -Name $UserName -Password $SecurePassword -Description "$(if($IsAdministrator){'Administrator account'}else{'Standard user account'})" -ErrorAction Stop if ($IsAdministrator) { Add-LocalGroupMember -Group "Administrators" -Member $UserName -ErrorAction Stop Write-Host "Administrator account created successfully" -ForegroundColor Green } else { Add-LocalGroupMember -Group "Users" -Member $UserName -ErrorAction Stop Write-Host "Standard user account created successfully" -ForegroundColor Green } } catch { Write-Warning "Failed to create user account: $_" } # 5. Create Network Shares if ($NetworkShares.Count -gt 0) { Write-Host "Creating network shares..." -ForegroundColor Yellow foreach ($share in $NetworkShares) { Write-Host "Setting up share: $($share.Name)" -ForegroundColor Cyan try { # Create folder if it doesn't exist if (!(Test-Path -Path $share.Path)) { New-Item -Path $share.Path -ItemType Directory -Force | Out-Null Write-Host " Created folder: $($share.Path)" -ForegroundColor Green } # Remove existing share if it exists $existingShare = Get-SmbShare -Name $share.Name -ErrorAction SilentlyContinue if ($existingShare) { Remove-SmbShare -Name $share.Name -Force Write-Host " Removed existing share" -ForegroundColor Yellow } # Create the share $smbParams = @{ Name = $share.Name Path = $share.Path ErrorAction = 'Stop' } if ($share.Description) { $smbParams.Description = $share.Description } switch ($share.Access) { "Read" { $smbParams.ReadAccess = "Everyone" } "Full" { $smbParams.FullAccess = "Everyone" } "Custom" { # Change access is read + write but not delete $smbParams.ChangeAccess = "Everyone" } } New-SmbShare @smbParams | Out-Null # Set NTFS permissions on the folder $acl = Get-Acl $share.Path switch ($share.Access) { "Read" { $permission = "ReadAndExecute" } "Full" { $permission = "FullControl" } "Custom" { $permission = "Modify" } } $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Everyone", $permission, "ContainerInherit,ObjectInherit", "None", "Allow") $acl.SetAccessRule($accessRule) Set-Acl -Path $share.Path -AclObject $acl Write-Host " ✓ Share '$($share.Name)' created successfully" -ForegroundColor Green Write-Host " Path: $($share.Path)" -ForegroundColor Gray Write-Host " Access: $($share.Access)" -ForegroundColor Gray Write-Host " Network path: \\$ComputerName\$($share.Name)" -ForegroundColor Gray } catch { Write-Warning " ✗ Failed to create share '$($share.Name)': $_" } } } # 6. Install Network Printers if ($NetworkPrinters.Count -gt 0) { Write-Host "Installing network printers..." -ForegroundColor Yellow foreach ($printer in $NetworkPrinters) { Install-NetworkPrinter -PrinterName $printer.Name -PrinterIP $printer.IP -SetAsDefault $printer.SetDefault } } # 7. Install software if ($SoftwareList.Count -gt 0) { Write-Host "Installing software packages..." -ForegroundColor Yellow foreach ($app in $SoftwareList) { Write-Host "Installing: $app" -ForegroundColor Cyan try { winget install --silent --accept-package-agreements --accept-source-agreements $app Write-Host " ✓ $app installed" -ForegroundColor Green } catch { Write-Warning " ✗ Failed to install $app : $_" } } } # 8. Domain join if ($JoinDomain -and $DomainName) { Write-Host "Joining domain: $DomainName" -ForegroundColor Yellow Write-Host "Enter domain admin credentials when prompted..." -ForegroundColor Cyan try { $Credential = Get-Credential -Message "Enter domain admin credentials for $DomainName" Add-Computer -DomainName $DomainName -Credential $Credential -ErrorAction Stop Write-Host "Domain join successful" -ForegroundColor Green } catch { Write-Warning "Domain join failed: $_" } } Write-Host "" Write-Host "=== Setup Complete! ===" -ForegroundColor Green Write-Host "" Write-Host "Summary:" -ForegroundColor Yellow Write-Host " • Computer renamed to: $ComputerName" Write-Host " • User created: $UserName ($(if($IsAdministrator){'Administrator'}else{'Standard User'}))" if ($NetworkShares.Count -gt 0) { Write-Host " • Network shares created: $($NetworkShares.Count)" foreach ($share in $NetworkShares) { Write-Host " - \\$ComputerName\$($share.Name) ($($share.Access) access)" -ForegroundColor Gray } } if ($NetworkPrinters.Count -gt 0) { Write-Host " • Network printers installed: $($NetworkPrinters.Count)" foreach ($printer in $NetworkPrinters) { Write-Host " - $($printer.Name) ($($printer.IP))$(if($printer.SetDefault){' [Default]'})" -ForegroundColor Gray } } if ($WiFiSSID) { Write-Host " • WiFi configured: $WiFiSSID" } if ($StaticIPConfig) { Write-Host " • Static IP configured: $($StaticIPConfig.IPAddress)/$($StaticIPConfig.PrefixLength)" Write-Host " - Adapter: $($StaticIPConfig.AdapterName)" -ForegroundColor Gray Write-Host " - Gateway: $($StaticIPConfig.Gateway)" -ForegroundColor Gray } if ($SoftwareList.Count -gt 0) { Write-Host " • Software installed: $($SoftwareList.Count) packages" } if ($JoinDomain) { Write-Host " • Joined domain: $DomainName" } Write-Host "" Write-Host "A restart is required to apply all changes." -ForegroundColor Yellow Write-Host "Restart now? (Y/N):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $RestartChoice = Read-Host if ($RestartChoice -eq "Y" -or $RestartChoice -eq "y") { Write-Host "Restarting in 5 seconds..." -ForegroundColor Yellow Start-Sleep -Seconds 5 Restart-Computer -Force } else { Write-Host "Please restart the computer manually to complete setup." -ForegroundColor Yellow } } # Main Menu Loop $continue = $true while ($continue) { Clear-Host Write-Host "======================================" -ForegroundColor Green Write-Host " Windows Machine Setup Script" -ForegroundColor Green Write-Host "======================================" -ForegroundColor Green Write-Host "" Write-Host "Select an option:" -ForegroundColor Yellow Write-Host "1. Full Machine Setup" Write-Host "2. Create User Account" Write-Host "3. Install Software" Write-Host "4. Configure Network Printers" Write-Host "5. Configure Network Shares" Write-Host "6. Enable OpenSSH Server" Write-Host "7. Install WSL (Windows Subsystem for Linux)" Write-Host "8. Exit" Write-Host "" Write-Host "Enter your choice (1-8):" -ForegroundColor Cyan -NoNewline Write-Host " " -NoNewline $choice = Read-Host switch ($choice) { "1" { Full-Setup } "2" { Create-UserAccount } "3" { Install-Software } "4" { Configure-NetworkPrinters } "5" { Configure-NetworkShares } "6" { Enable-OpenSSHServer } "7" { Install-WSL } "8" { Write-Host "Exiting script. Goodbye!" -ForegroundColor Green $continue = $false } default { Write-Host "Invalid selection. Please choose 1-8." -ForegroundColor Red Start-Sleep -Seconds 2 } } }