1
votes

"msiexec" comment obtenir des informations sur la plate-forme

J'ai un script python qui génère des informations pour une base de données d'application.

Maintenant, j'ai besoin de récupérer la plate-forme prise en charge pour le fichier .msi spécifié. L'objectif est de distinguer les applications Win32 et x64 à l'intérieur du fichier .msi .

Je ne vois rien d'utile de msiexec /? Ce qui montre essentiellement la même chose que https: // docs. microsoft.com/en-us/windows/desktop/msi/command-line-options


2 commentaires

Veuillez vérifier le code Python que j'ai trouvé sur github.com. Je ne suis pas sûr que cela fonctionnera, pas configuré pour tester.


Notez qu'il peut être important de préciser ce que vous entendez par «applications Win32 et x64». En fonction de votre définition, ils peuvent différer avec rien dans la base de données .msi que vous pouvez vérifier, ou différer uniquement de manière subtile, comme des conditions qui incluent VersionNT64 . Ou votre définition peut correspondre parfaitement au Résumé du modèle comme mentionnés dans les réponses ci-dessous.


3 Réponses :


1
votes

Vous pouvez consulter le Résumé du modèle de l'objet Windows Installer? Voici un exemple VBScript que vous pouvez convertir en Python:

'create installer object
Set oInstaller = CreateObject("WindowsInstaller.Installer")
'open msi in read-only mode
Set oDatabase = oInstaller.OpenDatabase("C:\Temp\test.msi", 0)
Dim streamobj : Set streamobj = oDatabase.SummaryInformation(0) '0 = read only
'read PID_TEMPLATE (template summary)
MsgBox streamobj.Property(7)
Set streamobj = Nothing
Set oDatabase = Nothing
Set oInstaller = Nothing


2 commentaires

J'ai vu quelque chose de similaire dans le code C #. Comment puis-je convertir cela en python? Existe-t-il une bibliothèque Python respective?


ok j'ai trouvé ça docs.python.org/3/library/msilib.html devrait aider



1
votes

Suggestion : Je ne suis pas un type Python (sans jeu de mots), mais j'aime piller github.com chaque fois que j'ai besoin de quelque chose comme ça. Voici ce que j'ai trouvé . Et le github. com recherche aléatoirement définie sur la page 21 .

cscript.exe WiSumInf.vbs Test.msi

Bitness : les informations de bitness sont conservées dans le Flux d'informations récapitulatives pour le MSI, et il est appelé la valeur Template . Vous devez l'analyser pour déterminer s'il s'agit d'un package 64 bits . Les valeurs valides sont décrites ici . Il existe plusieurs types de processeurs 64 bits. Il vous suffit de rechercher x64 , Intel64 , ARM64 le cas échéant - x64 est le plus courant pour le bureau (je crois). Découvrez comment Advanced Installer le fait .


Indicateur de composant 64 bits : un vrai cadeau pour un package 64 bits est que tous les composants marqués comme msidbComponentAttributes64bit (qui ajoute 256 , 0x0100 à l'indicateur d'attribut) dans la colonne Attributes de la table Component dans la Table des composants signifie que le package MSI a être 64 bits pour prendre en charge ces composants.


MSI SDK : je mentionnerai également que le MSI SDK binaire MsiInfo .exe (% ProgramFiles (x86)% \ Windows Kits ) peut lire facilement la valeur du modèle et l'exemple d'API MSI WiSumInf.vbs peut faire de même.

Exemple de CMD :

MsiInfo.exe Test.msi

et

import msilib
#import sys

db = msilib.OpenDatabase("setup.msi", msilib.MSIDBOPEN_READONLY)
print( db.GetSummaryInformation(0).GetProperty(7))


0 commentaires

1
votes

Voici le code que j'utilise actuellement pour ce problème:

import msilib

def msi_is_for_x64_only(path):
    data_base = msilib.OpenDatabase(str(path), msilib.MSIDBOPEN_READONLY)
    try:
        info = data_base.GetSummaryInformation(0)
        template = info.GetProperty(msilib.PID_TEMPLATE)
        platform_string = template.decode("utf-8").split(';')[0]
        return {
            'Intel': False,
            '': False,
            'Intel ': False,
            'x64': True,
            'Intel64': True
        }[platform_string]
    finally:
        # with msilib.OpenDatabase(str(path), msilib.MSIDBOPEN_READONLY) as data_base:
        # can't be used here
        data_base.Close()


2 commentaires

Bien, peut-être faire une validation du MSI en utilisant Orca pour vous assurer que tout va bien dans le flux de résumé?


Merci pour vos commentaires, mais ORCA MSI Editor ne me donne rien. J'ai déjà vérifié que ce script fonctionne avec des fichiers msi connus. De plus, j'ai une infrastructure prête en python, donc msilib est une solution pratique et ORCA MSI Editor nécessite un travail supplémentaire.