IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Editer les propriétés d'un fichier MSI [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 109
    Points : 77
    Points
    77
    Par défaut Editer les propriétés d'un fichier MSI
    Bonjour à tout le monde,

    Mon but est de créer un script Powershell permettant d'éditer les propriétés d'un fichier MSI.

    J'ai essayé de faire fonctionner le code suivant sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $fileMSI = "G:\DIVERS\MIG_ORCA\MODIF_MSI\GPAOTHP2007.msi"
    $msiOpenDatabaseMode = 0
    
    $windowsInstaller = New-Object -ComObject windowsInstaller.Installer
    
    $database = $windowsInstaller.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $null, $windowsInstaller, @($fileMSI, $msiOpenDatabaseMode))
    $query="UPDATE Property SET ProductVersion=4.00.1968"
    
      
    $propUpdate = $database.GetType().InvokeMember("OpenView", "InvokeMethod", $null, $database, ($query))
    $propUpdate.GetType().InvokeMember("Execute", "InvokeMethod", $null, $propUpdate, $null) | Out-Null
    $propUpdate.GetType().InvokeMember("Close", "InvokeMethod", $null, $propView, $null) | Out-Null
    J'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception lors de l'appel de «*InvokeMember*» avec «*5*» argument(s)*: «*OpenView,Sql*»
    Au caractère Ligne:10 : 1
    + $propUpdate = $database.GetType().InvokeMember("OpenView", "InvokeMet ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : COMException
    Si quelqu'un a une idée comment arriver à mes fins , je suis preneur.

    Merci d'avance.

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Bonjour,

    Cette galère

    Voici un code fonctionnel qui ferme bien la base de données après opération.
    Testé sur le package MSI de 7-zip 7z2201-x64.msi dans le même dossier que le script

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $MsiFilePath = "${PSScriptRoot}\7z2201-x64.msi"
    $Query = "UPDATE Property SET Property.Value='9.8.7' WHERE Property.Property='ProductVersion'"
     
    $WindowsInstaller = New-Object -ComObject WindowsInstaller.Installer
     
    $Database = $WindowsInstaller.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $Null, $WindowsInstaller, @($MsiFilePath, 1))
     
    $View = $Database.GetType().InvokeMember("OpenView", "InvokeMethod", $Null, $Database, ($Query))
     
    $View.GetType().InvokeMember("Execute", "InvokeMethod", $Null, $View, $Null)        
    $View.GetType().InvokeMember("Close", "InvokeMethod", $Null, $View, $Null)
    [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($View)
     
    $Database.GetType().InvokeMember("Commit", "InvokeMethod", $Null, $Database, $Null)
    [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($Database)

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 109
    Points : 77
    Points
    77
    Par défaut
    Bonjour et merci pour le coup de main , cela fonctionne parfaitement !

    J'ai pu mettre à jour toutes les tables du MSI par contre il reste une dernière information qui se situe dans la section "Summary Information" et plus particulièrement l'information Package Code que je voudrai modifier en mettant un nouvel GUID.
    J'ai trouvé la propriété SummaryInformation de la methode OpenDataBase mais elle ne contient que les 4 premières informations.

    Est-ce tu sais comment y accéder et lui attribuer un nouvel GUID.

    Merci encore pour ton aide.


    Nom : NEW_GUID.jpg
Affichages : 425
Taille : 49,0 Ko

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    La section "Summary Information" ne se réfère elle pas simplement a la property "ProductCode" ?

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 109
    Points : 77
    Points
    77
    Par défaut
    Bien vu !

    Effectivement , il existe une propriété qui se nomme PID_REVNUMBER et qui est en fait le packageCode du fichier MSI.

    Le code ci-dessous fait le job.

    Merci encore pour ton aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        $MsiFilePath = "G:\DIVERS\MIG_ORCA\MODIF_MSI\GPAOTHP2007.msi"
        $WindowsInstaller = New-Object -ComObject WindowsInstaller.Installer
        $Database = $WindowsInstaller.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $Null, $WindowsInstaller, @($MsiFilePath, 1))
    
        $NEW_GUID="{" + ([guid]::NewGuid().toString().ToUpper()) + "}"
        $SummaryInformation=$Database.SummaryInformation(20)
    
        $SummaryInformation.Property(9)=$NEW_GUID
    
        $SummaryInformation.Persist()
        $Database.GetType().InvokeMember("Commit", "InvokeMethod", $Null, $Database, $Null)
      
        [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($SummaryInformation)
        [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($Database)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier les propriétés d'un fichier Excel
    Par LudwigVon88 dans le forum Général Java
    Réponses: 1
    Dernier message: 09/04/2008, 17h28
  2. Comment modifier les propriétés d'un fichier NTFS
    Par ChristopheG dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/12/2006, 18h40
  3. Récupérer les propriétés d'un fichier avec GtkFileChooser
    Par yodo21 dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 26/10/2006, 17h30
  4. Modifier les propriétés d'un fichier
    Par manu1407 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 09/11/2005, 10h39
  5. Comment retrouver les propriétés d'un fichier ?
    Par JuanLopez1966 dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 01/09/2004, 16h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo