Functions/Public/Install-VirtualBoxGuestAdditions.ps1

function Install-VirtualBoxGuestAdditions {
    # Install the latest version of VirtualBox Guest Additions

    # Run as admin
    Test-IsAdmin | Out-Null

    Write-Output "Installation of VirtualBox Guest Additions for Windows - Beginning"

    # Get the latest VirtualBox version number
    $getLatestVersion = Invoke-WebRequest -URI "https://download.virtualbox.org/virtualbox/LATEST.TXT" -UseBasicParsing
    $getLatestVersion.Content.TrimEnd() | Out-Null
    $version = ($getLatestVersion).Content.ToString()
    
    # Parse the folder containing the latest version to get the name of the "VirtualBox Guest Additions"
    $url = ("https://download.virtualbox.org/virtualbox/$version").TrimEnd()
    $fileNameToDownload = (Invoke-WebRequest -Uri $url -UseBasicParsing | ForEach-Object { $_.Links } | Where-Object { $_.href -like "VBoxGuestAdditions*.iso" } | Select-Object -Property href)
    $fileName = $fileNameToDownload.href
    $finalUrl = "$url\$fileName"

    # Save iso file locally
    $pathToSaveFile = "$env:TEMP\VBoxGuestAdditions.iso"

    if (Test-Path -Path $pathToSaveFile) {
        Remove-Item -Path $pathToSaveFile -Force
        Write-Output "The old version of the file has been deleted."
    }

    if (-not (Test-Path -Path $pathToSaveFile)) {
        Write-Output "Download in progress... Please be patient!"
        Invoke-WebRequest -Uri "$url\$fileName" -OutFile $pathToSaveFile -UseBasicParsing
        Write-Output "The file has been downloaded."
    }

    # Mount ISO and run the exe in silent mode
    $isoDrive = Mount-DiskImage -ImagePath $pathToSaveFile -PassThru
    $isoLetter = ($isoDrive | Get-Volume).DriveLetter
    $exePath = ($isoLetter + ":\" + "VBoxWindowsAdditions.exe")

    # Install VBoxGuestAdditions silently
    Start-Process -FilePath $exePath -ArgumentList @("/S") -Wait
    Write-Output "VBoxGuestAdditions has been installed"

    # Dismount ISO
    Dismount-DiskImage -ImagePath $pathToSaveFile | Out-Null
    Dismount-DiskImage -ImagePath $pathToSaveFile | Out-Null
    Write-Output "Installation of VirtualBox Guest Additions for Windows - End"

    Write-Host "Do you want to restart your computer right now to complete the installation?"
    Write-Host "[Y]es or [N]o, default is No."
    
    $answer = Read-Host
    if ($answer -eq "Y" -or $answer -eq "Yes") {
        Write-Output "You said Yes"
        Restart-Computer
    }
    elseif ($answer -eq "N" -or $answer -eq "No") {
        Write-Output "You said No"
        Write-Output "Have a nice day!"
    }
    else {
        Write-Output "Your answer is confused, so your computer will not restart."
        Write-Output "Have a nice day!"
    }
}