msiexec как получить информацию о платформе - PullRequest
1 голос
/ 12 марта 2019

У меня есть некоторый скрипт на python, который генерирует информацию для некоторой базы данных приложения.

Теперь мне нужно получить поддерживаемую платформу для указанного .msi файла. Цель состоит в том, чтобы различать приложения Win32 и x64 внутри файла .msi.

Я не вижу ничего полезного от msiexec /? Который в основном показывает то же самое, что и https://docs.microsoft.com/en-us/windows/desktop/msi/command-line-options

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Предложение : Я не парень из Python (не каламбур), но мне нравится грабить github.com всякий раз, когда мне нужно что-то подобное. Вот что я нашел . И поиск github.com произвольно устанавливается на страницу 21 .

import msilib
#import sys

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

Битность : Информация о битности сохраняется в Summary Information Stream для MSI, и оно называется значением Template.You must parse it to determine if it is a 64-bit package. Допустимые значения описаны здесь .Существует несколько разновидностей 64-битных процессоров.Просто отсканируйте для x64, Intel64, ARM64 в зависимости от ситуации - x64 является наиболее распространенным для настольных компьютеров(Я верю). Посмотрите, как это делает Advanced Installer .


64-битный флаг компонента : реальная раздача для 64-битного пакетачто любые компоненты, помеченные как msidbComponentAttributes64bit (что добавляет 256, 0x0100 к флагу атрибута) в столбце Атрибуты таблицы компонентов в Таблица компонентов означает, что пакет MSI должен быть 64-разрядным для поддержки таких компонентов.


MSI SDK : Я также упомяну, что MSI SDK бинарный MsiInfo.exe (%ProgramFiles(x86)%\Windows Kits) может легко прочитать значение шаблона, и пример MSI API WiSumInf.vbs может сделать то же самое.

Образец CMD :

MsiInfo.exe Test.msi

и

cscript.exe WiSumInf.vbs Test.msi

Дополнительные ссылки:

1 голос
/ 18 марта 2019

Вот код, который я сейчас использую для этой проблемы:

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()
1 голос
/ 12 марта 2019

Можно проверить Сводка шаблона объекта установщика Windows? Вот пример VBScript, который вы можете конвертировать в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...