Eintrag aus der MSI-Regristrierung entfernen

  • strict warning: Non-static method view::load() should not be called statically in /usr/share/nginx/www/drupal/sites/all/modules/views/views.module on line 1113.
  • strict warning: Declaration of views_handler_field::query() should be compatible with views_handler::query($group_by = false) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_field.inc on line 0.
  • strict warning: Declaration of views_handler_field_user::init() should be compatible with views_handler_field::init(&$view, $options) in /usr/share/nginx/www/drupal/sites/all/modules/views/modules/user/views_handler_field_user.inc on line 0.
  • strict warning: Declaration of views_handler_argument::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_argument.inc on line 0.
  • strict warning: Declaration of views_handler_argument::query() should be compatible with views_handler::query($group_by = false) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_argument.inc on line 0.
  • strict warning: Declaration of views_handler_sort::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_sort::options_submit() should be compatible with views_handler::options_submit($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_sort::query() should be compatible with views_handler::query($group_by = false) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_filter::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_filter.inc on line 0.
  • strict warning: Declaration of views_handler_filter::query() should be compatible with views_handler::query($group_by = false) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_filter.inc on line 0.
  • strict warning: Declaration of views_handler_relationship::query() should be compatible with views_handler::query($group_by = false) in /usr/share/nginx/www/drupal/sites/all/modules/views/handlers/views_handler_relationship.inc on line 0.
  • strict warning: Declaration of views_plugin_query::options_submit() should be compatible with views_plugin::options_submit($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/plugins/views_plugin_query.inc on line 0.
  • strict warning: Declaration of views_plugin_argument_validate::options_submit() should be compatible with views_plugin::options_submit($form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/plugins/views_plugin_argument_validate.inc on line 0.
  • strict warning: Declaration of views_plugin_row::options_validate() should be compatible with views_plugin::options_validate(&$form, &$form_state) in /usr/share/nginx/www/drupal/sites/all/modules/views/plugins/views_plugin_row.inc on line 0.

Hin und wieder beschäftige ich mich mit Setups, Deployment und Installationen. Verschiedene Betriebssysteme haben dazu unterschiedliche Lösungen entwickelt. Im Linux gibt es eine Fülle verschiedener Systeme, z. B. Deb- und RPM-Packete sowie Portage. In Windows gibt es MSI. An sich sind solche Packete eine gute Sache, nur kann man sich auch an verschiedenen Stellen in den Fuß schießen. Besonders einfach geht das mit MSI.

Problem

Wenn ich MSI-Packete erstelle, nutze ich dazu Windows Installer XML - eines der wenigen Open Source Projekte von Microsoft. Den Installer lasse ich oft nur für bestimmte Windows-Versionen zu:

<!-- Check if we have Win2k, WinXP or Vista -->
<Condition Message='!(loc.ConditionInvalidWindowsVersion)'>
        VersionNT = 500 OR VersionNT = 501 OR VersionNT = 600
</Condition>

Diese „Launch Conditions“ haben schon mehrfach Probleme mit nicht unterstützten Windows-Versionen gar nicht erst auftauchen lassen und eine Liste mit den entsprechenden VersionNT-Werten gibt hier.

Beachtet man dabei aber nicht, dass die Windows-Upgrade-Funktion aus einem Windows Vista in Windows 7 machen kann, bekommt man evtl. Probleme. Natürlich werden dabei schon installierte Programme übernommen und will man eine Anwendung mit eben gezeigter MSI-Startbedingung entfernen stellt man fest, dass das nicht geht:
MSI Launch Condition ProblemMSI Launch Condition Problem

Lösung

Um überhaupt erstmal an eine Lösung denken zu können, muss die aktuelle Version erstmal weg. Da man über die Systemsteuerung leider keine Art „Zwang“ auf eine Deinstallatin ausüben kann, muss man die Komandozeile (viel mehr ist das Ding in Windows auch wirklich nicht) bemühen. Mit Visual Studio wird ein Programm namens „msizap“ installiert, das genau für unsere Zwecke da ist: Alle Spuren einer Installation zu entfernen.

Dazu öffnet man am besten die „Visual Studio Komandozeile“ (ein normales CMD-Fenster mit ein paar gesetzten Umgebungsvariablen mehr) und entfernt die Installation anhand des Product-Codes:

msizap T {Product-Code}

Wie bei vielen MS-Tools werden erhöhte Rechte benötigt und man sieht die Ausgaben nur, wenn man das Programm schon aus einer Admin-CMD ausgeführt hat...

Außerdem bietet es sich an die Launch-Conditions zu verändern. Die einfachste, aber nicht vorausschauende Lösung ist es, Windows 7 explizit zu unterstützen:

<!-- Check if we have Win2k, WinXP, Vista or 7 -->
<Condition Message='!(loc.ConditionInvalidWindowsVersion)'>
        VersionNT = 500 OR VersionNT = 501 OR VersionNT = 600 OR VersionNT = 601
</Condition>

Product-Code finden

Bei einigen von mir erstellten Setups ändert sich ständig der Product-Code. Das hat den Hintergrund, dass bei MSI kleine Updates (sog. Minor Upgrades) nicht sonderlich gut unterstützt sind und ich in vielen Fällen „Major Upgrades“ bei neueren Versionen der Anwendung verwende. Somit kann man aber nicht im WiX-Quellcode nachsehen. Glücklicherweise fand (nach ganz unten scrollen) ich ein kleines Stük C#-Quellcode der alle Informationen über die intallierten Anwendungen ausgibt:

using System;

namespace Tools
{
    class Program
    {
        static void Main(string[] args)
        {
            ListMsiInfo();

            System.Console.ReadKey();
        }

         /// <summary>
        /// This method REQUIRES a referance to msi.dll in Windows\System32.  (com interopt)
        /// </summary>
        private static void ListMsiInfo()
        {
            // List of all the attributes you can query for.
            var attributes = new string[]
                                 {
                                     "HelpLink",
                                     "HelpTelephone",
                                     "InstallDate",
                                     "InstallLocation",
                                     "InstalledProductName",
                                     "InstallSource",
                                     "LocalPackage",
                                     "ProductID",
                                     "Publisher",
                                     "PackageName",
                                     "RegCompany",
                                     "RegOwner",
                                     "URLInfoAbout",
                                     "URLUpdateInfo",
                                     "VersionMinor",
                                     "VersionMajor",
                                     "VersionString",
                                     "Transforms",
                                     "Language",
                                     "AssignmentType",
                                     "PackageCode",
                                     "PackageName",
                                     "ProductIcon",
                                     "ProductName",
                                     "Version",
                                     "InstanceType",
                                 };
 
            // Get a referance to the WindowsInstaller.Installer via com interopt.
            WindowsInstaller.Installer winInstaller = null;
            Type oType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
            if (oType == null) return;
            winInstaller = (WindowsInstaller.Installer) Activator.CreateInstance(oType);
            if (winInstaller == null) return;
           
            // Iterate through all the productIds of the installed apps.
            foreach (string productId in winInstaller.Products)
            {
                // Write out the product code.
                Console.WriteLine(productId);
 
                // try to get and print each attribute
                foreach (string attribute in attributes)
                {
                    string aVal = winInstaller.get_ProductInfo(productId, attribute);
                    if (string.IsNullOrEmpty(aVal)) continue;
                    Console.WriteLine("{0}:{1}", attribute, aVal);
                }
            }
        }
    }
}

Um nicht den Eintrag in der „Konsole“ zu verpassen, muss man den Zeilenpuffer eben dieser in den Eigenschaften erhöhen.

Update: Obrigen code habe ich noch um ein paar Filter erweitert. Das Ergebnis ist auf GitHub zu finden. Dort gibts auch Binaries, zum direkten Ausführen.

Hin und wieder beschäftige ich mich mit Setups, Deployment und Installationen. Verschiedene Betriebssysteme haben dazu unterschiedliche Lösungen entwickelt. Im Linux gibt es eine Fülle verschiedener Systeme, z. B. Deb- und RPM-Packete sowie Portage. In Windows gibt es MSI. An sich sind solche Packete eine gute Sache, nur kann man sich auch an verschiedenen Stellen in den Fuß schießen. Besonders einfach geht das mit MSI.Problem

Trackback URL for this post:

https://blog.voodoo-arts.net/trackback/71
burberryoutlet-store-online.com

burberry sales dnSDQIRJ burberryoutlet-store-online.com

Submitted by burberryoutletclst1 (not verified) on Fri, 2012-09-21 23:13.

Tags for Eintrag aus der MSI-Regristrierung entfernen