PDF pagePrint page
26.03.2010 21:08 Age: 4 yrs

I10006 - 3.2.1064 - Windows 7 Hotfix Integration

Category: SoftService Installer - Informations

 

Die Integration von Hotfixen, die direkt bei dem Rollout installiert werden, ist sehr einfach.

 

Der SoftService Installer unterstützt Sie bei der Intergration von Patchen in das Betriebssystem. Die Patche werden schon während des Rollouts installiert. Sie benötigen dafür kein eigenes Patchmanagment oder Internetzugang bei der Installation.

Wenn Sie die Entscheidung getroffen haben, welche Patche Sie ausrollen wollen, sind es nur noch drei Schritte bis zu vollständigen Intergration.

  • Herunterladen
  • Entpacken
  • Kopieren

Die einzelnen Schritte habe wir Ihnen im nachfolgenden detailiert beschrieben.

Wie kommen Sie an die Patche

Microsoft stellt eine komfortablen Downloadserver für alle Hotfixe bereit. Diesen erreichen Sie unter der url: http://catalog.update.microsoft.com/v7/site/Home.aspx Über die Suche ist es sehr leicht den gewünschten Fix für das Betriebssystem zu finden.

Markieren Sie erst alle Hotfixe, die Sie herunterladen wollen und starten im Anschluß den Download.

Nach dem Download finden Sie alle Hotfixe in Form von .msu Dateien in eigenen Unterverzeichnissen.

Entpacken der MSU Dateien

Bevor die Updates, die Sie von Microsoft herunter geladen haben, im Installer verwendet werden können, müssen Sie die .msu Datei entpacken.
Dies können Sie sehr einfach über die expand.exe erledigen. Die Kommandozeile dazu lautet:

expand.exe -f:* "<Vollständigen Pfad auf die .msu Datei>" "<Ziel Ordner für den Inhalt>"

Dieser Weg ist sehr umständlich. Einfacher ist die Verwendung des Scriptes, das wir für Sie erstellt haben. Bitte erstellen Sie ein Datei z.B. mit dem Namen msu_expand.vbs und dem folgenden Inhalt s.u. in einem beliebigen Verzeichnis und rufen diese einmalig per Doppelklick auf.

Danach finden Sie im Kontextmenu jeder .msu Datei die "expand" Funktion. Wenn Sie diese aufrufen, entpackt das Script die .msu Datei in ein Unterverzeichnis mit dem Namen der Datei.

msu_expand.vbs

Code:  Select all
Option Explicit
 
Dim sMSUFileNamePath, sMSUFileName, sMSUFilePath
Dim oShell, sTargetFolder
 
Do Until False
  If WScript.Arguments.Count = 0 Then
    Registry_Value_Set "HKCR", _
                     "Microsoft.System.Update.1\shell\expand\command", _
                     "", _
                     "wscript """ & WScript.ScriptFullName & """ ""%1""", _
                     "REG_SZ"
    MsgBox "Der Kontext-Menü-Handler wurde registriert.", vbOKOnly, "SoftService Installer"
    Exit Do
  End if  
 
  sMSUFileNamePath = WScript.Arguments.Item(0)
  sMSUFileName = Mid(sMSUFileNamePath, InStrRev(sMSUFileNamePath, "\") + 1)
  sMSUFilePath = Left(sMSUFileNamePath, instrrev(sMSUFileNamePath, "\") - 1)
 
  sTargetFolder = sMSUFilePath & "\" & Left(sMSUFileName, Len(sMSUFileName) - 4)
  if not Folder_Create(sTargetFolder) Then Exit Do
 
  Set oShell = CreateObject("WScript.Shell")
 
  oShell.run "cmd /c expand -f:* """ & sMSUFileNamePath & """ """ & sTargetFolder & """", 1, True
  Set oShell = Nothing
  Exit Do
loop  
 
' Creates nested folders. Returns "True" if folder already exists or created successfully.
Private Function Folder_Create(i_FolderName)
  Dim oFSO
 
  Set oFSO = CreateObject("Scripting.FileSystemObject")
  Do Until False
    If oFSO.FolderExists(i_FolderName) Then Exit Do
    If Len(i_FolderName) = 0 Then Exit Do
 
    If Not Folder_Create(oFSO.GetParentFolderName(i_FolderName)) Then Exit Do
 
    oFSO.CreateFolder(i_FolderName)
    Exit do
  loop  
  Folder_Create = oFSO.FolderExists(i_FolderName)
  Set oFSO = Nothing   
End Function
 
Public Function Registry_Value_Set(ByVal i_Root, ByVal i_KeyPath, ByVal i_Value, ByVal i_Data, ByVal i_DataType)
  Dim objRegistry, objMethod, objInParam
 
	Do Until False
    Registry_Value_Set = False
 
    If Not NormalizeRegistryRoot(i_Root) Then Exit do  
    If Not NormalizeRegistryDataType(i_DataType) Then Exit do  
 
    Set objRegistry=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
 
	  Set objMethod	= objRegistry.Methods_(i_DataType)
	  Set objInParam = objMethod.inParameters.SpawnInstance_()
 
	  objRegistry.CreateKey i_Root, i_KeyPath
	  with objInParam
	    .hDefKey = i_Root: .sSubKeyName = i_KeyPath: .sValueName = i_Value
	    Select Case i_DataType
	      Case "SetStringValue":         .sValue = i_Data
	      Case "SetExpandedStringValue": .sValue = i_Data
	      Case "SetMultiStringValue":    .sValue = i_Data
	      Case "SetDWORDValue":          .uValue = CLng(i_Data)
	    End Select  
	  End with  
	  call objRegistry.ExecMethod_(i_DataType, objInParam)
 
    Registry_Value_Set = True: Exit Do
  Loop
  Set objRegistry = Nothing
End function    
 
Private Function NormalizeRegistryDataType(ByRef o_DataType)
 
  Do Until False
    NormalizeRegistryDataType = False
 
    Select Case lcase(o_DataType)
      Case "binary",         "reg_binary":           o_DataType = "SetBinaryValue"
      Case "dword",          "reg_dword":            o_DataType = "SetDWORDValue"
      Case "expandedstring", "reg_expanded_sz":      o_DataType = "SetExpandedStringValue"
      Case "multistring",    "reg_multi_sz":         o_DataType = "SetMultiStringValue"
      Case "string",         "reg_sz":               o_DataType = "SetStringValue"
    End Select
 
    NormalizeRegistryDataType = True: Exit Do
  loop  
End function
 
Private Function NormalizeRegistryRoot(ByRef o_Root)
  Const HKEY_CLASSES_ROOT 	= &H80000000
	Const HKEY_CURRENT_USER 	= &H80000001
  const HKEY_LOCAL_MACHINE  = &H80000002
	Const HKEY_USERS 		      = &H80000003
 
  Do Until False
    NormalizeRegistryRoot = false
 
    Select Case o_Root
      Case "HKEY_CLASSES_ROOT",  "HKCR", HKEY_CLASSES_ROOT:       o_Root = HKEY_CLASSES_ROOT
      Case "HKEY_CURRENT_USER",  "HKCU", HKEY_CURRENT_USER:       o_Root = HKEY_CURRENT_USER  
      Case "HKEY_LOCAL_MACHINE", "HKLM", HKEY_LOCAL_MACHINE:      o_Root = HKEY_LOCAL_MACHINE
      Case "HKEY_USERS",         "HKU",  HKEY_USERS:              o_Root = HKEY_USERS  
      Case Else:                                                  Exit do
    End Select
 
    NormalizeRegistryRoot = True: Exit Do
  Loop
End Function    
 
 

Intergration in den Installer

Als letzen Schritt müssen Sie das so erstellte Patch Verzeichnis noch dem Installer bereit stellen.

Auch dieses ist sehr einfach. Bitte kopieren Sie das Verzeichnis einfach in den "packages" Folder des gewünschten Betriebsystemes.

Als Beispiel hier der Pfad des Windows 7 Enterprise x86 englisch:

  • ..\software\nt7wEx86.eng\packages

Das war alles.

Den Rest übernimmt der Installer für Sie. Sobald die Installation gestartet wird ermittelt der Installer alle Unterverzeichnisse unterhalb von "packages" und liest die Beschreibung .xml aus. Alle Werte, die benötigt werden um den Patch in die unattended.xml auf zu nehmen sind darin enthalten.

Die unattended.xml generiert der PEClient für jede Installation individuell.

Ein Patch wird über den "servicing" Node eingebunden. Hier ein Beispiel der generierten xml :