none
Créer des clés dans HKLM depuis un projet d'installation RRS feed

  • Question

  • Bonjour,

    J'aurais besoin de créer des nouvelles clés dans la base de registre (Local Machine) depuis un projet d'installation (msi) à partir d'informations récupérées sur le poste client.

    J'ai fait un exécutable avec un fichier manifeste pour modifier le niveau du contrôle utilisateur. Si j’exécute ce fichier en dehors du projet d'installation, les clés sont bien créées, mais quand j'essaye de faire exécuter ce fichier comme action personnalisée par le projet d'installation, les clés ne sont pas créées.

    J'ai aussi essayé de créer les clés directement depuis l'éditeur de registre du projet d'installation, là non plus, les clés ne sont pas créées.

    Il y a-t-il un moyen de modifier le niveau du contrôle utilisateur pour le projet d'installation pour que ces clés soient effectivement créées ?

    Merci

    lundi 30 avril 2012 09:09

Réponses

  • Bonjour,

    Tests effectués depuis VS2010 pro sur Windows 7 64 bits.
    Voilà qui devient interessant.

    Si votre MSI est compilé en 32-bit, alors le CustomAction s'exécutera en 32-bit, et votre clé sera crée dans : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node

    Pour forcer la création d'une clé dans HKEY_LOCAL_MACHINE\SOFTWARE, quelque soit l'architecture, vous devez utilisez la méthode OpenBaseKey() (disponible dans le .NET Framework 4.0). http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.openbasekey.aspx avec comme paramètre RegistryView.Registry64.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    lundi 30 avril 2012 13:47
    Modérateur

Toutes les réponses

  • Bonjour,

    Normalement, l'exécution d'un MSI requiert les droits administrateurs, donc votre CustomAction fonctionne avec les droits administrateur.

    Pouvez-vous nous montrer le code qui crée les clés ?
    Obtenez vous une erreur lors de l'exécution de votre MSI ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    lundi 30 avril 2012 09:31
    Modérateur
  • Merci pour la réponse rapide.

    Non, je n'ai pas d'erreur lors de l'exécution du MSI.

    Le code qui crée les clés :

                string prefix = @"Software\Autodesk\AutoCAD";
                RegistryKey rk = Registry.CurrentUser.OpenSubKey(prefix);
                var keys = rk.GetSubKeyNames()
                    .Where(s => s.StartsWith("R") && s.CompareTo("R18.1") > 0)
                    .Select(s => string.Format("{0}\\{1}", prefix, s))
                    .SelectMany(s => Registry.CurrentUser.OpenSubKey(s).GetSubKeyNames()
                        .Where(k => Regex.IsMatch(k, "^ACAD-....:..."))
                        .Select(k => string.Format("{0}\\{1}", s, k)));
    
                RegistryKey rklm = Registry.LocalMachine;
    
                foreach (string key in keys)
                {
                    using (RegistryKey cosmKey = rklm.CreateSubKey(key + "\\Variables\\CUSTOSMODE"))
                    {
                        cosmKey.SetValue("", 0, RegistryValueKind.DWord);
                        cosmKey.SetValue("LowerBound", 0, RegistryValueKind.DWord);
                        cosmKey.SetValue("PrimaryType", 5003, RegistryValueKind.DWord);
                        cosmKey.SetValue("StorageType", 2, RegistryValueKind.DWord);
                        cosmKey.SetValue("UpperBound", 15, RegistryValueKind.DWord);
                    }
                    using (RegistryKey fracKey = rklm.CreateSubKey(key + "\\Variables\\COSMODEFRACDEN"))
                    {
                        fracKey.SetValue("", 5, RegistryValueKind.String);
                        fracKey.SetValue("LowerBound", 5, RegistryValueKind.DWord);
                        fracKey.SetValue("PrimaryType", 5003, RegistryValueKind.DWord);
                        fracKey.SetValue("StorageType", 2, RegistryValueKind.DWord);
                        fracKey.SetValue("UpperBound", 255, RegistryValueKind.DWord);
                    }
                    using (RegistryKey ospKey = rklm.CreateSubKey(key + "\\Applications\\OsnapPalette"))
                    {
                        string filename = string.Format("{0}\\{1}.dll", target, key.Contains("R19") ? "OsnapPalette_19" : "OsnapPalette_18");
                        ospKey.SetValue("DESCRIPTION", "Custom Object Snap Palette", RegistryValueKind.String);
                        ospKey.SetValue("LOADCTRLS", 2, RegistryValueKind.DWord);
                        ospKey.SetValue("LOADER", filename, RegistryValueKind.String);
                        ospKey.SetValue("MANAGED", 1, RegistryValueKind.DWord);
                    }
                }

    Quelques précisions :

    Que code ci dessus soit intégré à la méthode Install d'une classe héritant de System.Configuration.Install.Installer ou à la méthode Main() d'un projet séparé (exe), l'un comme l'autre étant utilisé comme CustomAction par le projet d'installation, les clés ne se créent pas sans qu'il y ait d'erreur. Si le même fichier exe (avec manifeste pour élévation des droits) est exécuté séparément, les clés sont créées.

    Tests effectués depuis VS2010 pro sur Windows 7 64 bits.

    lundi 30 avril 2012 09:41
  • Bonjour,

    Tests effectués depuis VS2010 pro sur Windows 7 64 bits.
    Voilà qui devient interessant.

    Si votre MSI est compilé en 32-bit, alors le CustomAction s'exécutera en 32-bit, et votre clé sera crée dans : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node

    Pour forcer la création d'une clé dans HKEY_LOCAL_MACHINE\SOFTWARE, quelque soit l'architecture, vous devez utilisez la méthode OpenBaseKey() (disponible dans le .NET Framework 4.0). http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.openbasekey.aspx avec comme paramètre RegistryView.Registry64.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    lundi 30 avril 2012 13:47
    Modérateur
  • Merci beaucoup, mon problème semble résolu.
    lundi 30 avril 2012 14:24