OSD icon indicating copy to clipboard operation
OSD copied to clipboard

Surface Laptop 7 for Business Intel Driver Pack fails to install after rebooting

Open Justin-Swets opened this issue 10 months ago • 29 comments

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.

Justin-Swets avatar Mar 04 '25 14:03 Justin-Swets

What OS are you applying when it errors? Does it work a different OS version?

MichaelEscamilla avatar Mar 04 '25 14:03 MichaelEscamilla

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

Image

Justin-Swets avatar Mar 04 '25 14:03 Justin-Swets

Ok gotcha, I see from over on Discord. I'll follow up with him.

MichaelEscamilla avatar Mar 04 '25 14:03 MichaelEscamilla

I worked on this last night. I tried to do an Admin install (msiexec /a) and this ran for about 30 minutes like this

Image

Rebooted to WinPE to review the log and this is the output

Image

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.

OSDeploy avatar Mar 04 '25 15:03 OSDeploy

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.

OSDeploy avatar Mar 04 '25 15:03 OSDeploy

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.

Justin-Swets avatar Mar 04 '25 16:03 Justin-Swets

I engaged Surface support

Justin-Swets avatar Mar 07 '25 13:03 Justin-Swets

@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.

Skeb1ns avatar Mar 26 '25 07:03 Skeb1ns

This is also an issue for the Surface Studio 2 laptops btw.

Skeb1ns avatar Mar 26 '25 11:03 Skeb1ns

The solution may be to install the MSI during OOBE ... I'll have a solution in a few weeks to test this out

OSDeploy avatar Mar 26 '25 15:03 OSDeploy

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 😄)

Skeb1ns avatar Mar 26 '25 15:03 Skeb1ns

If you're using the GUI, then change this to not use the DriverPack. If you're using the CLI, no.

OSDeploy avatar Mar 26 '25 16:03 OSDeploy

I was able to disable the DriverPack like this using $Global:MyOSDCloud:

$Global:MyOSDCloud = @{
    DriverPackName = 'None'
}
Start-OSDCloud @OSDCloudParams

everydayintech avatar Mar 26 '25 17:03 everydayintech

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:MyOSDCloud hash 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 in C:\Drivers but that triggers the regular Driver Pack installation).
  • Added a Start-Process -FilePath msiexec -ArgumentList "/i ""$pathDriverLocal\$driverPack"" /qn /norestart /L*v ""$pathDriverLocal\$driverPack.log""" -Wait to my SetupComplete script (which is placed in C:\OSDCloud\Scripts\SetupComplete so that OSDCloud can pick it up. Populate the variables with the path and driver pack name.

Done!

Skeb1ns avatar Mar 31 '25 08:03 Skeb1ns

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.

Justin-Swets avatar Mar 31 '25 15:03 Justin-Swets

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.

rdjr71 avatar Apr 09 '25 21:04 rdjr71

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.

Skeb1ns avatar Apr 17 '25 15:04 Skeb1ns

I wish I had a Surface to test the new OSDCloud ... I'm building blind here fingers crossed it will work

OSDeploy avatar Apr 17 '25 18:04 OSDeploy

Let me know if you want me to test something 👍🏼

Skeb1ns avatar Apr 17 '25 18:04 Skeb1ns

Im testing Surface 6 and 7 to confirm, thanks for the heads up @Skeb1ns

Justin-Swets avatar Apr 17 '25 19:04 Justin-Swets

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 avatar Apr 18 '25 17:04 Justin-Swets

@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.

OSDeploy avatar Apr 18 '25 17:04 OSDeploy

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.

Justin-Swets avatar Apr 18 '25 18:04 Justin-Swets

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

Justin-Swets avatar Apr 22 '25 13:04 Justin-Swets

FYI, this will be handled automatically in the new OSDCloud released post-MMSMOA. There are no plans to port to OSDCloud v1 (current release)

Image

OSDeploy avatar Apr 22 '25 15:04 OSDeploy

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{}

MitchvB avatar Jun 12 '25 09:06 MitchvB

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."
}

roryvossepoel avatar Jun 26 '25 14:06 roryvossepoel

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.

PaiSolutions avatar Jul 15 '25 07:07 PaiSolutions

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.

MitchvB avatar Jul 30 '25 13:07 MitchvB