Surface Laptop 7 for Business Intel Driver Pack fails to install after rebooting
The Surface Laptop 7 for Business Intel driver pack is failing to install after rebooting the device. This is after OSDCloud has been run successfully. Will upload install log.
What OS are you applying when it errors? Does it work a different OS version?
Hello Michael,
David is aware of this issue as he asked me to open a new issue. He completed adding the driver pack to OSDCloud and asked that I open a new issue for the drivers not installing. This issue is happening on Win 11 24H2. I have uploaded a log and screenshot. Thanks for the help.
SurfaceLaptopforBusiness7thEditionwithIntel_Win11_26100_25.013.32214.0.msi-20250303T141320.log.txt
Ok gotcha, I see from over on Discord. I'll follow up with him.
I worked on this last night. I tried to do an Admin install (msiexec /a) and this ran for about 30 minutes like this
Rebooted to WinPE to review the log and this is the output
So it's not looking great. I'll try again tonight to unpack in OOBE which should work, but please don't expect a solution for days at the earliest, if possible.
I believe the solution may be to just use Microsoft Update Catalog to at least get the Disk and Net drivers and update in OOBE.
I did test the Microsoft Catalog Update and it installed a bunch of drivers but Keyboard and Mouse still did not work. I updated my OSDCLoud USB drive, is there a way to force it not to use the driver pack if using the Start-OSDCloud command? I will also log a case with my Microsoft Surface Rep. Thanks for all the help, really appreciated.
I engaged Surface support
@Justin-Swets
Got an update? Currently having the same issue during a test with a 7th gen that will replace our 6th gens in due time.
This is also an issue for the Surface Studio 2 laptops btw.
The solution may be to install the MSI during OOBE ... I'll have a solution in a few weeks to test this out
Check. Is there a way for now to exclude the driverpack install on these devices?
I will modify setupcomplete to install it during OOBE like you suggested. (I'm afraid that I can't wait a few weeks and I totally understand that it can take a while from your side 😄)
If you're using the GUI, then change this to not use the DriverPack. If you're using the CLI, no.
I was able to disable the DriverPack like this using $Global:MyOSDCloud:
$Global:MyOSDCloud = @{
DriverPackName = 'None'
}
Start-OSDCloud @OSDCloudParams
I can confirm that installing the driver pack during OOBE works fine.
I've done the following to work around this issue until the OSDCloud module has a proper fix:
- I check the device model during start of the main script (I'm using a custom script with a gui at the front) and add the
DriverPackName value "None"to the$global:MyOSDCloudhash table for the affected models to skip the regular Driver Pack installation. - After the OSDCloud process is finished I copy the preloaded driver pack .msi based on the model to
C:\OSDCloud\Temp(I first dropped it inC:\Driversbut that triggers the regular Driver Pack installation). - Added a
Start-Process -FilePath msiexec -ArgumentList "/i ""$pathDriverLocal\$driverPack"" /qn /norestart /L*v ""$pathDriverLocal\$driverPack.log""" -Waitto my SetupComplete script (which is placed inC:\OSDCloud\Scripts\SetupCompleteso that OSDCloud can pick it up. Populate the variables with the path and driver pack name.
Done!
Sorry for my delay in response, was on PTO last week. I am still working with Surface Support. Thanks for doing some work on this @Skeb1ns , I may have to go that route in the near term if we need to provision newly purchased devices. You may also want to log a support case with Surface Support so they know other orgs are having similar issues.
Does this happen with any other MSI you execute the same way? Would be a good test. Just wondering if this is related to 24H2 OS and not an issue with the MSI you are trying to use. The Surface driver MSIs for latest models look the same as Surface driver MSIs from years ago, based on looking in Orca, except obviously the basic checks for system model name and required OS version.
This behavior also occurs on the Surface Laptop 6 for Business since the last driver pack update that was posted on April 11th (SurfaceLaptop6forBusiness_Win11_22631_25.033.38584.0.msi). My workaround for this model works as well.
I wish I had a Surface to test the new OSDCloud ... I'm building blind here fingers crossed it will work
Let me know if you want me to test something 👍🏼
Im testing Surface 6 and 7 to confirm, thanks for the heads up @Skeb1ns
Confirmed Surface 6 same issue. Will need to implement workaround provided by @Skeb1ns . Might as well install the driverpack on OOBE for all models at this point.
@Justin-Swets I solved this issue last night in the new OSDCloud, so bring an extra Surface we can wipe to MMSMOA
There are no plans to implement in the existing OSDCloud at this time.
I definitely will have an extra Surface with me!
When setting the DriverPackName = 'None' in the $Global:MyOSDCloud, it does not look like the driverpack is downloaded. I wonder if setting up the Setupcomplete script and just moving the driverpack from C:\Drivers to C:\Temp would still work.
I was able to successfully use a form of the scripts provided by @everydayintech and @Skeb1ns. Instead of setting the Global variable to None for the driver pack, I am just moving the pack that is downloaded from the C:\Drivers folder to C:\Temp. Then I have the setupcomplete.ps1 execute the commandline to install the driver pack. This will prevent future Surface driver packs from causing issues as all of them will install during setupcomplete. Thanks for all the discussion on this topic, glad to see everyone helping out!
Move driverpack after Start-OSDCloud finishes
Try { If (!(Test-Path -Path C:\Temp)){New-Item -Path C:\Temp -ItemType Directory -Force } Move-Item -Path C:\Drivers\*.msi -Destination C:\Temp }catch{}
Setupcomplete.ps1
$Driverpack = (Get-ChildItem C:\Temp\*.msi) $Driverpackpath = $Driverpack.FullName $Logpath = "C:\OSDCloud\DriverPack.log" Start-Process -FilePath msiexec -ArgumentList "/i $DriverPackPath /qn /norestart /L*v$Logpath" -Wait
FYI, this will be handled automatically in the new OSDCloud released post-MMSMOA. There are no plans to port to OSDCloud v1 (current release)
I was able to successfully use a form of the scripts provided by @everydayintech and @Skeb1ns. Instead of setting the Global variable to None for the driver pack, I am just moving the pack that is downloaded from the C:\Drivers folder to C:\Temp. Then I have the setupcomplete.ps1 execute the commandline to install the driver pack. This will prevent future Surface driver packs from causing issues as all of them will install during setupcomplete. Thanks for all the discussion on this topic, glad to see everyone helping out!
Move driverpack after Start-OSDCloud finishes
Try { If (!(Test-Path -Path C:\Temp)){New-Item -Path C:\Temp -ItemType Directory -Force } Move-Item -Path C:\Drivers\*.msi -Destination C:\Temp }catch{}Setupcomplete.ps1
$Driverpack = (Get-ChildItem C:\Temp\*.msi) $Driverpackpath = $Driverpack.FullName $Logpath = "C:\OSDCloud\DriverPack.log" Start-Process -FilePath msiexec -ArgumentList "/i $DriverPackPath /qn /norestart /L*v$Logpath" -Wait
I'm also having this problem with a Surface Pro 10, can anyone explain where I can add this step? Move driverpack after Start-OSDCloud finishes Try { If (!(Test-Path -Path C:\Temp)){New-Item -Path C:\Temp -ItemType Directory -Force } Move-Item -Path C:\Drivers\*.msi -Destination C:\Temp }catch{}
This is what I'm currently using for the Surface Laptop 7 for Business. I haven't tested it on other models yet.
Shutdown.ps1 (copy to OSDCloudUSB-drive\OSDCloud\Config\Scripts\Shutdown)
$target = "C:\OSDCloud\Drivers"
Try {
# Ensure the target directory exists
if (!(Test-Path -Path $target)) {
New-Item -Path $target -ItemType Directory -Force | Out-Null
Write-Host "Target directory created: $target"
}
# Move all .msi files from source to target
Move-Item -Path "C:\Drivers\*.msi" -Destination $target -Force -ErrorAction Stop
Write-Host "Driver package(s) successfully moved to: $target"
} Catch {
Write-Warning "Failed to move driver package(s): $_"
}
SetupComplete.cmd (copy to OSDCloudUSB-drive\OSDCloud\Config\Scripts\SetupComplete)
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "%~dp0SetupComplete.ps1"
SetupComplete.ps1 (copy to OSDCloudUSB-drive\OSDCloud\Config\Scripts\SetupComplete)
$driverFolder = "C:\OSDCloud\Drivers"
$logPath = "C:\OSDCloud\DriverPack.log"
# Attempt to locate the first .msi driver package
$driverPackage = Get-ChildItem -Path "$driverFolder\*.msi" -ErrorAction SilentlyContinue | Select-Object -First 1
if ($driverPackage) {
$driverPath = $driverPackage.FullName
Write-Host "Driver package found: $driverPath"
Write-Host "Starting installation via ServiceUI. Log file: $logPath"
try {
Start-Process -FilePath "msiexec.exe" `
-ArgumentList "/i `"$driverPath`" /qn /norestart /l*v `"$logPath`"" `
-Wait -ErrorAction Stop
Write-Host "Driver package installed successfully."
} catch {
Write-Warning "Driver installation failed: $_"
}
} else {
Write-Host "No driver package found in $driverFolder."
}
This is what I'm currently using for the Surface Laptop 7 for Business. I haven't tested it on other models yet.
Shutdown.ps1 (copy to OSDCloudUSB-drive\OSDCloud\Config\Scripts\Shutdown)
$target = "C:\OSDCloud\Drivers" Try { # Ensure the target directory exists if (!(Test-Path -Path $target)) { New-Item -Path $target -ItemType Directory -Force | Out-Null Write-Host "Target directory created: $target" } # Move all .msi files from source to target Move-Item -Path "C:\Drivers\*.msi" -Destination $target -Force -ErrorAction Stop Write-Host "Driver package(s) successfully moved to: $target" } Catch { Write-Warning "Failed to move driver package(s): $_" }SetupComplete.cmd (copy to OSDCloudUSB-drive\OSDCloud\Config\Scripts\SetupComplete)
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "%~dp0SetupComplete.ps1"SetupComplete.ps1 (copy to OSDCloudUSB-drive\OSDCloud\Config\Scripts\SetupComplete)
$driverFolder = "C:\OSDCloud\Drivers" $logPath = "C:\OSDCloud\DriverPack.log" # Attempt to locate the first .msi driver package $driverPackage = Get-ChildItem -Path "$driverFolder\*.msi" -ErrorAction SilentlyContinue | Select-Object -First 1 if ($driverPackage) { $driverPath = $driverPackage.FullName Write-Host "Driver package found: $driverPath" Write-Host "Starting installation via ServiceUI. Log file: $logPath" try { Start-Process -FilePath "msiexec.exe" ` -ArgumentList "/i `"$driverPath`" /qn /norestart /l*v `"$logPath`"" ` -Wait -ErrorAction Stop Write-Host "Driver package installed successfully." } catch { Write-Warning "Driver installation failed: $_" } } else { Write-Host "No driver package found in $driverFolder." }
This is working for our Surface Laptop 7/5/4 devices. Thank you so much for this. Still trying to understand the cause of the issue.
Thank you, can confirm this works perfect! I was using unpacked drivers and custom scripts to deploy them with DISM, this worked for a few weeks. Somehow it doesn't detect the drivers anymore, they are placed in this structure USB:\OSDCloud\DriverPacks\DISM$ComputerManufacturer$ComputerProduct. Tried it with pnputil at setupcomplete but this works way better and cleaner.