Workaround for KB2444193 with USMT 4

Posted on Updated on

There is a known issue when migrating to Windows 7 with USMT.  If a computer is deployed using an AutoUnattend.xml, then after migrating a user to the new computer, when the user launches IE they receive the message “A program on your computer has corrupted your default search provider…“.  One workaround is to have a script correct the SearchScope GUIDs for each user profile.  The script that I have written (below) simply mounts each user profile hive, then deletes the registry tree for the SearchScopes.  The effect is that when the user first launches IE 8, then it will pull the default Search Provider from HKLM defined in the deployed computer via AutoUnattend.


'==========================================================================
' NAME: DeleteUserIESearchProviders
' AUTHOR: Nick Moseley, https://t3chn1ck.wordpress.com
' COMMENT: Mounts user registry hives and deletes the IE Search Provider
' registry values.  This is to fix the issue caused by KB2444193
' HISTORY:
' 1.0 (06/23/2011) - Initial Script
'==========================================================================
Option Explicit
Const ForAppending = 8
Const HKLM = &H80000002
Const sUserKey = "Software\Microsoft\Internet Explorer\SearchScopes"
Dim oReg, oFSO, oFile, oUserSubkey, aUserProfiles, oShell
Dim sProfileLCase, sRegExe, sRegLoad, sRegUnload, sHiveName, sSubPath, sProfile, sValueName, sKeyPathUserProfiles, sValue, ReturnVal
Set oReg = GetObject("winmgmts:\\.\root\default:StdRegProv")
Set oShell = CreateObject("WScript.Shell")
Set oFSO = CreateObject ("Scripting.FileSystemObject")
' Prompt if OK to continue
Dim x
x = msgbox ("Click OK to delete the IE Search Provider for all user profiles", vbOKCancel, "Fix IE Search Provider")
If x<>1 Then
 WScript.Echo "Script Terminated"
 WScript.Quit
End If
'==========================================================================
' Begin log file etnries
'==========================================================================
If Not oFSO.FileExists("C:\DeleteSearchProvider.log") Then
 oFSO.CreateTextFile "C:\DeleteSearchProvider.log"
End If
Set oFile = oFSO.OpenTextFile ("DeleteSearchProvider.log", ForAppending, True)
oFile.WriteLine "Delete IE Search Provider"
oFile.WriteLine "  => Began at " & Date & " " & Time
oFile.WriteLine "  => For each user profile, deleted HKCU\" & sUserKey
'==========================================================================
' Begin configuration of existing user profiles
sValueName = "ProfileImagePath"
sKeyPathUserProfiles = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
sRegExe = "C:\Windows\system32\reg.exe"
oReg.EnumKey HKLM, sKeyPathUserProfiles, aUserProfiles
' Existing User Profiles
Dim sHiveKeyPath
For Each oUserSubkey In aUserProfiles
    sSubPath = sKeyPathUserProfiles & "\" & oUserSubkey
    oReg.GetExpandedStringValue HKLM,sSubPath,sValueName,sValue
 
    sProfile = Split(sValue, "\")
    sProfileLCase = LCase(sProfile(2))
 
    If sProfileLCase = "system32" Then
     'oFile.WriteLine "  => Skipped user profile: system32"
    ElseIf sProfileLCase = "localservice" Then
     'oFile.WriteLine "  => Skipped user profile: localservice"
    ElseIf sProfileLCase = "networkservice" Then
     'oFile.WriteLine "  => Skipped user profile: networkservice"
    ElseIf sProfileLCase = "serviceprofiles" Then
     'oFile.WriteLine "  => Skipped user profile: serviceprofiles"
    ElseIf sProfileLCase = "administrator" Then
     'oFile.WriteLine "  => Skipped user profile: administrator"
    ElseIf sProfileLCase = "default" Then
     'oFile.WriteLine "  => Skipped user profile: default user"
    Else
     sHiveName = "TempHive_" & sProfileLCase
   
     ' Load user's profile hive into a temp location
     sRegLoad = " LOAD HKLM\" & sHiveName & " """ & sValue & "\ntuser.dat"""
     oShell.Run sRegExe & sRegLoad, 0, True
   
     ' Call subroutine to change registry key
  sHiveKeyPath = sHiveName & "\" & sUserKey
     DeleteSubkeys (sHiveKeyPath)
  oFile.WriteLine "  => Set user profile: " & sProfileLCase
   
     ' Unload user's profile hive
     sRegUnload = " UNLOAD HKLM\" & sHiveName
     oShell.Run sRegExe & sRegUnload, 0, True
    End If 
Next
' End logging
oFile.WriteLine "  => Completed at " & Date & " " & Time
WScript.Echo "Script Completed"
WScript.Quit (oFile.Close)
Sub DeleteSubkeys(sTempHiveKeyPath)
 Dim aSubKeys, oSubKey
 
    oReg.EnumKey HKLM, sTempHiveKeyPath, aSubKeys
    If IsArray(aSubKeys) Then
        For Each oSubKey In aSubKeys
            DeleteSubkeys sTempHiveKeyPath & "\" & oSubKey
        Next
    End If
    oReg.DeleteKey HKLM, sTempHiveKeyPath
End Sub

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s