Recuperando propriedades públicas de um arquivo MSI

12

Existe uma ferramenta ou mecanismo para recuperar as propriedades públicas disponíveis de um arquivo Windows MSI?

Alguns fornecedores que fornecem arquivos MSI não os documentam, então estou curioso para saber se há uma maneira de expô-los sem o código-fonte.

Ken Barber
fonte
8
O ORCA da Microsoft , o SuperORCA da Pantaray e quase todas as outras edições do MSI permitem navegar / editar qualquer tabela, incluindo a Propertytabela. Você teve um fluxo de trabalho ou caso de uso específico fora apenas bisbilhotando no MSI?
Jscott #
2
Eu queria entender as propriedades públicas disponíveis para que elas pudessem ser transmitidas com precisão durante a instalação, sem precisar consultar o fornecedor ou a documentação (pois isso nem sempre é possível). Com o Puppet, podemos transmitir as propriedades do MSI durante a instalação (envolvemos o misexec.exe), portanto é útil ter essa capacidade.
Ken Barber
1
Pode haver outras propriedades públicas que você pode transmitir para controlar a instalação, embora elas não estejam listadas na tabela Propriedades. As propriedades podem ser definidas dinamicamente, dependendo de uma condição, por exemplo, pesquisa no Registro. Portanto, a documentação do fornecedor é a melhor fonte de informação.
Alexey Ivanov
Você também pode executar a instalação com log detalhado para ver como as propriedades alteram seus valores.
Alexey Ivanov
Desculpe o atraso - tentei o Orca e seu fascinante, mas confirmei o comportamento que você descreve @AlexeyIvanov - ou seja, algumas propriedades não aparecerão. Confirmei isso com o splunk.msi e seus documentos. Acho que os que aparecem no Orca têm padrões, mas essa não é uma lista canônica. Você pode explicar um pouco mais sobre a metodologia de registro detalhado?
Ken Barber

Respostas:

8

Lessmsi fornece uma linha de comando e um aplicativo interativo para recuperar qualquer atributo do .msi.

Interativamente, abra o arquivo .msi, vá para o modo de exibição Tabela e selecione ou digite "Propriedade". No entanto, enquanto isso fornece os nomes das propriedades, não fornece os valores válidos para a propriedade (ou ainda não descobri o lugar certo para procurar).

Linha de comando para listar a tabela Propriedades para o console (frustrantemente, não pode ser capturada com > output.csvredirecionamento simples )

lessmsi l -t Property ...\path\to\setup.msi
Matt Wilson
fonte
1

Como o arquivo MSI armazena propriedades públicas em um banco de dados interno, você pode realmente consultá-las usando VBScript e SQL.

Aqui está um exemplo de script que retornará todas as propriedades armazenadas no arquivo MSI. É convenção usar letras maiúsculas para definir propriedades públicas, e é assim que elas geralmente são identificáveis.

James Hebden
fonte
1

lessmsi é uma ótima ferramenta que certamente funciona aqui se você deseja abrir sua GUI e fazer alguma investigação manual. No entanto, direi que o seguinte comando não apresenta todas as propriedades de maneira confiável:

lessmsi l -t Property <msi_name>

Uma maneira de (melhor) garantir que você obtenha todas as propriedades possíveis é realmente executar uma instalação, reparar ou desinstalar com o arquivo MSI e registrar o processo. O comando a seguir registra apenas as propriedades e nada mais:

<msi_name> /lp! <msi_property_logfile>

O comando acima é equivalente a:

msiexec /lp! <msi_property_logfile> /i <msi_name>

Meu método preferido, no entanto, é realmente não instalar / remover / reparar (e simplesmente extrair). As vantagens que esse método possui sobre lessmsi é que ele não requer um utilitário de terceiros (ou seja, lessmsi ) e não requer que você mexa com nenhuma instalação. Como você tem espaço em disco suficiente para instalar o programa, você pode:

msiexec /a <msi_name> /lp! <msi_property_logfile> TARGETDIR=<absolute_path_to_extract_to>

Observe que o <absolute_path_to_extract_to>ponto pode apontar para um diretório inexistente (o comando criará os diretórios necessários ou falhará).

Se você odeia a interface do usuário da instalação por qualquer motivo, pode anexar a /qropção, que 'reduzirá' e possivelmente eliminará a interface do usuário sem prejudicar o processo de registro de propriedades. Entretanto, esteja avisado - se você ficar "mais baixo" do que a UI reduzida (viz. /qb| /passiveOu /qn| /quiet), <msi_property_logfile>poderá haver algumas propriedades ausentes.

YenForYang
fonte
O problema desse método é: você precisa realmente executar o instalador. Mesmo que você o instale em um targetdir fora do padrão, você ainda estragou os registros.
Wang
0

A maneira como estou fazendo isso agora é usando o módulo Carbon Powershell. Para instalar o tipo de módulo:

Install-Module -Name 'Carbon' -AllowClobber

Então simplesmente

msi your_msi_path.msi

Exemplo:

msi putty-64bit-0.70-installer.msi

ProductName                 ProductVersion Manufacturer ProductCode                         

-----------                 -------------- ------------ -----------                         

PuTTY release 0.70 (64-bit) 0.70.0.0       Simon Tatham 45b3032f-22cc-40cd-9e97-4da7095fa5a2
gigi
fonte
-1

Eu acho que agora provavelmente a melhor maneira de fazer isso é usando o PowerShell. Aqui está um script que faz o trabalho muito bem: https://gallery.technet.microsoft.com/scriptcenter/Get-MsiDatabaseProperties-09d9c87c

gigi
fonte
Esta resposta é apenas um link, que pode mudar / desaparecer.
David Makogon
Existem outras respostas que são simplesmente um link. Eu não me sinto confortável copiando e colando código de outras pessoas. Acho que minha resposta oferece uma opção alternativa e eu realmente não entendo o voto negativo.
Gigi