# Registry und MsiExec



## derheine (12. Juli 2007)

Hallo zusammen,

ich hab ein riiiiesiges Problem! Ich versuche vergebens seit Montag ein Skript zu schreiben (.vbs, hab ich noch nie gemacht ) welches mir aus der Windows Registry aus \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall die ganzen UninstallStrings ausliest, diese irgendwie speichert (oder nur so damit weiter arbeitet) und dann den UninstallString mit anderen Parametern für MsiExec ausführt. Und zwar soll das wie folgt aussehen:

```
MsiExec.exe /qn /fs {UninstallString}
```

Der in der Registry stehende UninstallString sieht wie folgt aus:

```
MsiExec.exe /X{UninstallString}
```

Das X muss weg, das ist ja die Deinstallation  Das Skript soll aber die Desktop-/ Startmenusymbole von Programmen wiederherstellen (/fs) und das Ganze im Hintergrund ohne Benachrichtigung (/qn)

Für jegliche Hilfe (sofern ich im richtigen Forum bin?!) wäre ich sehr dankbar!


Mfg,
Jens

P.S.:
ich hab hier schon ein Skript, das irgendwas mit dem UninstallString anstellt! Ich weiß nur leider nicht was, also bringts mir nix 


```
Option Explicit

DIM WshShell, fs
 
Set WshShell = WScript.CreateObject ("WScript.Shell")
Set fs=CreateObject("Scripting.FileSystemObject")


Function GetUnInstallString(strSearchName, strSearchPath)
 '*** Ermittelt den UnInstall-Aufruf anhand des Quellpfades bzw. Anzeigenamens ***

 Const UnInstKey = "\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
 Const UnInstKeyWSH = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"

 Dim objReg, oRootkey, oSubKey, oVal, bDerWars, strUninstall

 If strSearchName = "" Then
   '*** Vorgabe: Nicht gefunden ***
   GetUnInstallString = ""
 Else
   '*** Vorgabe: strSearchName als Registry-Schlüssel versuchen ***
   GetUnInstallString = TryRegRead(UnInstKeyWSH + strSearchName + "\UninstallString")
   If GetUnInstallString <> "" Then Exit Function
 End If

 If not DebugMode Then On Error Resume Next

 ' Erzeuge Objektreferenz auf Regobj.dll
 Set objReg = WScript.CreateObject("RegObj.Registry")

 If Err.Number <> 0 Then
   '*** Versuch, die RegObj.dll zu installieren ***
   fs.CopyFile GetDfsShare + RegobjDllSrcFolder + "\Regobj.dll", _
               WshShell.ExpandEnvironmentStrings("%SYSTEMROOT%\System32\"), True
   WshShell.Run "RegSvr32.exe /s ""%SYSTEMROOT%\System32\RegObj.dll""", , True
   Err.Clear
   '*** 2. Versuch, das Objekt zu instanziieren ***
   Set objReg = WScript.CreateObject("RegObj.Registry")
 End If

 ' Hole Auflistungsobjekt des Hauptschlüssels
 Set oRootkey = objReg.RegKeyFromString(UnInstKey)

 '*** Nicht erfolgreich => Ergebnis bleibt leer ***
 If Err.Number <> 0 Then Exit Function

 On Error goto 0

 '*** Uninstall-Abschnitt in der Registry nach passenden Einträgen durchsuchen ***
 bDerWars = False
 For Each oSubKey In oRootkey.SubKeys 'Alle eingetragenen Produkte
   strUninstall = ""
   For Each oVal In oSubKey.Values    'Alle Einträge je Produkt
     Select Case UCase(oVal.Name)
       Case UCase("InstallSource")
         '*** Quellpfad wie angegeben? ***
         If Instr(UCase(oVal.Value), UCase(strSearchPath)) > 0 and strSearchPath <> "" Then
           bDerWars = True
         End If
       Case UCase("DisplayName")
         '*** Name ggf. wie angegeben? ***
         If UCase(strSearchName) = UCase(oVal.Value) and strSearchName <> "" Then
           bDerWars = True
         End If
       Case UCase("UninstallString")
         '*** Befehlszeile für die Deinstallation ***
         strUninstall = oVal.Value
     End Select
   Next
   If bDerWars Then
     '*** Korrekten Eintrag gefunden ***
     If UCase(Left(strUninstall, 7)) = "MSIEXEC" and _
        Left(oSubKey.Name, 1) = "{" Then
       '*** Sonderfall MSI-Setup: Deinstallation per Parameter /X ***
       GetUnInstallString = "MsiExec.exe /X" + oSubKey.Name
     Else
       '*** Sonstige Deinstallationstoutine ***
       GetUnInstallString = strUninstall
     End If
     Exit For
   End If
 Next

End Function
```


----------

