Public/WinPE/Start-WinREWiFi.ps1

function Start-WinREWiFi {
    [CmdletBinding()]
    param (
        [string] $wifiProfile
    )
    #=================================================
    # Block
    #=================================================
    #Block-WinOS
    Block-PowerShellVersionLt5
    #=================================================
    # Header
    #=================================================
    Write-Host -ForegroundColor DarkGray "========================================================================="
    Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) $($MyInvocation.MyCommand.Name) " -NoNewline
    Write-Host -ForegroundColor Green 'OK'
    #=================================================
    # Test Internet Connection
    #=================================================
    Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Test-WebConnection google.com " -NoNewline

    if (Test-WebConnection -Uri 'google.com') {
        Write-Host -ForegroundColor Green 'OK'
        Write-Host -ForegroundColor DarkGray "You are already connected to the Internet"
        Write-Host -ForegroundColor DarkGray "Start-WinREWiFi will not continue"
        $StartWinREWiFi = $false
    }
    else {
        Write-Host -ForegroundColor Red 'FAIL'
        $StartWinREWiFi = $true
    }
    #=================================================
    # Test WinRE
    #=================================================
    if ($StartWinREWiFi) {
        Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Testing required WinRE content " -NoNewline

        if (!(Test-Path "$ENV:SystemRoot\System32\dmcmnutils.dll")) {
            #Write-Warning "Missing required $ENV:SystemRoot\System32\dmcmnutils.dll"
            $StartWinREWiFi = $false
        }
        if (!(Test-Path "$ENV:SystemRoot\System32\mdmpostprocessevaluator.dll")) {
            #Write-Warning "Missing required $ENV:SystemRoot\System32\mdmpostprocessevaluator.dll"
            $StartWinREWiFi = $false
        }
        if (!(Test-Path "$ENV:SystemRoot\System32\mdmregistration.dll")) {
            #Write-Warning "Missing required $ENV:SystemRoot\System32\mdmregistration.dll"
            $StartWinREWiFi = $false
        }
        if (!(Test-Path "$ENV:SystemRoot\System32\raschap.dll")) {
            #Write-Warning "Missing required $ENV:SystemRoot\System32\raschap.dll"
            $StartWinREWiFi = $false
        }
        if (!(Test-Path "$ENV:SystemRoot\System32\raschapext.dll")) {
            #Write-Warning "Missing required $ENV:SystemRoot\System32\raschapext.dll"
            $StartWinREWiFi = $false
        }
        if (!(Test-Path "$ENV:SystemRoot\System32\rastls.dll")) {
            #Write-Warning "Missing required $ENV:SystemRoot\System32\rastls.dll"
            $StartWinREWiFi = $false
        }
        if (!(Test-Path "$ENV:SystemRoot\System32\rastlsext.dll")) {
            #Write-Warning "Missing required $ENV:SystemRoot\System32\rastlsext.dll"
            $StartWinREWiFi = $false
        }
        if ($StartWinREWiFi) {
            Write-Host -ForegroundColor Green 'OK'
        }
        else {
            Write-Host -ForegroundColor Red 'FAIL'
        }
    }
    #=================================================
    # WlanSvc
    #=================================================
    if ($StartWinREWiFi) {
        Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Starting WlanSvc Service" -NoNewline
        if (Get-Service -Name WlanSvc) {
            if ((Get-Service -Name WlanSvc).Status -ne 'Running') {
                Get-Service -Name WlanSvc | Start-Service
                Start-Sleep -Seconds 10
    
            }
        }
        Write-Host -ForegroundColor Green 'OK'
    }
    #=================================================
    # Test Wi-Fi Adapter
    #=================================================
    if ($StartWinREWiFi) {
        Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Testing Wi-Fi Network Adapter " -NoNewline
        #$WirelessNetworkAdapter = Get-CimInstance -ClassName CIM_NetworkAdapter | Where-Object {$_.NetConnectionID -eq 'Wi-Fi'}
        $WirelessNetworkAdapter = Get-WmiObject -ClassName Win32_NetworkAdapter | Where-Object {$_.NetConnectionID -eq 'Wi-Fi'}
        #$WirelessNetworkAdapter = Get-SmbClientNetworkInterface | Where-Object {$_.FriendlyName -eq 'Wi-Fi'}
        if ($WirelessNetworkAdapter) {
            $StartWinREWiFi = $true
            Write-Host -ForegroundColor Green 'OK'
            Write-Host -ForegroundColor Gray " Name: $($WirelessNetworkAdapter.Name)"
            Write-Host -ForegroundColor Gray " Description: $($WirelessNetworkAdapter.Description)"
            #Write-Host -ForegroundColor Gray " Speed: $($WirelessNetworkAdapter.Speed)"
            Write-Host -ForegroundColor Gray " AdapterType: $($WirelessNetworkAdapter.AdapterType)"
            #Write-Host -ForegroundColor Gray " Installed: $($WirelessNetworkAdapter.Installed)"
            #Write-Host -ForegroundColor Gray " InterfaceIndex: $($WirelessNetworkAdapter.InterfaceIndex)"
            Write-Host -ForegroundColor Gray " MACAddress: $($WirelessNetworkAdapter.MACAddress)"
            #Write-Host -ForegroundColor Gray " NetEnabled: $($WirelessNetworkAdapter.NetEnabled)"
            #Write-Host -ForegroundColor Gray " PhysicalAdapter: $($WirelessNetworkAdapter.PhysicalAdapter)"
            Write-Host -ForegroundColor Gray " PNPDeviceID: $($WirelessNetworkAdapter.PNPDeviceID)"
        }
        else {
            $PnPEntity = Get-WmiObject -ClassName Win32_PnPEntity | Where-Object {$_.Status -eq 'Error'} |  Where-Object {$_.Name -match 'Net'}

            Write-Host -ForegroundColor Red 'FAIL'
            Write-Warning "Could not find an installed Wi-Fi Network Adapter"
            if ($PnPEntity) {
                Write-Warning "Drivers may need to be added to WinPE for the following hardware"
                foreach ($Item in $PnPEntity) {
                    Write-Warning "$($Item.Name): $($Item.DeviceID)"
                }
                Start-Sleep -Seconds 10
            }
            else {
                Write-Warning "Drivers may need to be added to WinPE"
            }
            $StartWinREWiFi = $false
        }
    }
    #=================================================
    # Test Wi-Fi Connection
    #=================================================
    if ($StartWinREWiFi) {
        Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Testing Wi-Fi Network Connection " -NoNewline
        if ($WirelessNetworkAdapter.NetEnabled -eq $true) {
            Write-Host -ForegroundColor Green ''
            Write-Warning "Wireless is already connected ... Disconnecting"
            (Get-WmiObject -ClassName Win32_NetworkAdapter | Where-Object {$_.NetConnectionID -eq 'Wi-Fi'}).disable() | Out-Null
            Start-Sleep -Seconds 5
            (Get-WmiObject -ClassName Win32_NetworkAdapter | Where-Object {$_.NetConnectionID -eq 'Wi-Fi'}).enable() | Out-Null
            Start-Sleep -Seconds 5
            $StartWinREWiFi = $true
        }
        else {
            Write-Host -ForegroundColor Green 'OK'
        }
    }
    #=================================================
    # Connect
    #=================================================
    if ($StartWinREWiFi) {
            if ($wifiProfile -and (Test-Path $wifiProfile)) {
                Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Starting unattended Wi-Fi connection " -NoNewline
            } else {
                Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Starting Wi-Fi Network Menu " -NoNewline
            }
            Write-Host -ForegroundColor Green 'OK'
            Write-Host -ForegroundColor DarkGray "========================================================================="

        while (((Get-CimInstance -ClassName Win32_NetworkAdapter | Where-Object {$_.NetConnectionID -eq 'Wi-Fi'}).NetEnabled) -eq $false) {
            Start-Sleep -Seconds 3

            $StartWinREWiFi = 0
            # make checks on start of evert cycle because in case of failure, profile will be deleted
            if ($wifiProfile -and (Test-Path $wifiProfile)) { ++$StartWinREWiFi }
    
            if ($StartWinREWiFi) {
                # use saved wi-fi profile to make the unattended connection
                try {
                    Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Establishing a connection using $wifiProfile"
                    Connect-WinREWiFiByXMLProfile $wifiProfile -ErrorAction Stop
                } catch {
                    Write-Warning $_
                    # to avoid infinite loop of tries
                    Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Removing invalid Wi-Fi profile '$wifiProfile'"
                    Remove-Item $wifiProfile -Force
                    continue
                }
            } else {
                # show list of available SSID to make interactive connection
                $SSIDList = Get-WinREWiFi
                if ($SSIDList) {
                    #show list of available SSID
                    $SSIDList | Sort-Object Signal -Descending | Select-Object Signal, Index, SSID, Authentication, Encryption, NetworkType | Format-Table
        
                    $SSIDListIndex = $SSIDList.index
                    $SSIDIndex = ""
                    while ($SSIDIndex -notin $SSIDListIndex) {
                        $SSIDIndex = Read-Host "Select the Index of Wi-Fi Network to connect or CTRL+C to quit"
                    }
        
                    $SSID = $SSIDList | Where-Object { $_.index -eq $SSIDIndex } | Select-Object -exp SSID
        
                    # connect to selected Wi-Fi
                    Write-Host -ForegroundColor DarkGray "========================================================================="
                    Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Establishing a connection to SSID $SSID"
                    try {
                        Connect-WinREWiFi $SSID -ErrorAction Stop
                    } catch {
                        Write-Warning $_
                        continue
                    }
                } else {
                    Write-Warning "No Wi-Fi network found. Move closer to AP or use ethernet cable instead."
                }
            }

            if ($StartWinREWiFi) {
                $text = "to Wi-Fi using $wifiProfile"
            } else {
                $text = "to SSID $SSID"
            }
            Write-Host -ForegroundColor Cyan "$((Get-Date).ToString('yyyy-MM-dd-HHmmss')) Waiting for a connection $text"
            Start-Sleep -Seconds 15
        
            $i = 30
            while ((((Get-CimInstance -ClassName Win32_NetworkAdapter | Where-Object {$_.NetConnectionID -eq 'Wi-Fi'}).NetEnabled) -eq $false) -and $i -gt 0) {
                --$i
                Write-Host -ForegroundColor DarkGray "Waiting for Wi-Fi Connection ($i)"
                Start-Sleep -Seconds 1
            }

            # connection to network can take a while
            #$i = 30
            #while (!(Test-WebConnection -Uri 'github.com') -and $i -gt 0) { --$i; "Waiting for Internet connection ($i)" ; Start-Sleep -Seconds 1 }
        }
        Get-SmbClientNetworkInterface | Where-Object {$_.FriendlyName -eq 'Wi-Fi'} | Format-List
    }
    Start-Sleep -Seconds 5
}