Extracting CAB files from Microsoft Update Standalone Package (MSU)

Posted by Alex Verboon on Saturday, September 4, 2010

When manually downloading a Microsoft Security Update or hotfix for Windows 7 (Vista) you typically get a file with an MSU file extension. A file with an MSU extension is a Microsoft Update Standalone package.

Microsoft Update Standalone Packages are installed through the Windows Update Standalone Installer WUSA.EXE which is located in the  C:\Windows\system32 folder. If you need to install many updates you could create a script like the one below.

SET HOTFIXSRC=
CD /D %HOTFIXSRC%
FORFILES /P %HOTFIXSRC% /M *.MSU /C “cmd /c wusa @file /quiet /norestart”

But if you are using the System Image Manager and want to include security updates or hotfixes in your unattended Windows 7 installation, you can only select CAB files.

image So where are the CAB files? They are included within the MSU file, so all we need to do is extract them. During the Windows Vista timeframe the recommendation was to use the expand.exe utility.

expand -f:* “C:\934307\Windows6.0-KB934307-x86.msu” %TEMP%

In Windows 7 WUSA.EXE has an additional new command line option called “/extract”.

wusa <updatepackage.msu> /extract:c:\temp\cab

To automate the process of extracting the CAB files from several MSU files, I have modified a script that Jason Scheffelmaer shared back in 2007 on MyITForum.

Dim ExtractFolder: ExtractFolder = “Cabs

Dim fso: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim wshShell: Set wshShell = CreateObject(“Wscript.Shell”)

Dim scriptDir
scriptDir = fso.GetParentFolderName(WScript.ScriptFullName)

On Error Resume Next
’ Deleting ExtractFolder subfolder to start clean
fso.DeleteFolder ScriptDir & “" & ExtractFolder
Err.Clear
On Error Goto 0

’ Create Cabs folder, we will put the extracted cabs there.
fso.CreateFolder ScriptDir & “" & ExtractFolder

Dim scriptFolder
Set scriptFolder = fso.GetFolder(ScriptDir)

dim scriptFolderFiles
Set scriptFolderFiles =scriptFolder.Files

Dim file, TotalExtracted

’ Initialize
TotalExtracted = 0

’ Loop thru all files in the folder that the script is ran in
For Each file in scriptFolderFiles
If Right(file.name, 4) = “.msu” Then
‘wscript.echo “Processing " & file.name
iRetVal = WshShell.Run(”wusa.exe " & ScriptDir & “" & file.Name & “** /extract:**” & ScriptDir & “" & ExtractFolder, 0, True)

If iRetVal = 0 Then
TotalExtracted = TotalExtracted + 1
Else
Wscript.echo “An error occurred while trying to extract the cab file from " & file.name & “…”
End If
End If
Next

’ Delete any unneeded wsusscan.cab files from the extractFolder
On Error Resume Next
fso.DeleteFile ScriptDir & “" & ExtractFolder & “\wsusscan.cab”, True
On Error Goto 0

WScript.Echo “A total of " & totalExtracted & " cab files were extracted. Script Complete.”