Domanda

Molti dei nostri clienti hanno accesso a InstallShield, WISE o AdminStudio. Questi non sono un problema. Spero che ci sia un modo per fornire ai nostri clienti più piccoli senza accesso agli strumenti di riconfezionamento commerciale una serie di strumenti e passaggi disponibili gratuitamente per effettuare da soli la sostituzione dei file.

È sufficiente sostituire un singolo file di configurazione all'interno di un MSI compresso, si può presumere che l'utente di destinazione abbia già installato Orca, sapere come utilizzarlo per personalizzare la tabella Proprietà (per incorporare i dettagli della licenza per la distribuzione dell'oggetto Criteri di gruppo) e aver generato un file MST.


Disclaimer : è molto simile a un'altra domanda ma sia le domande che le risposte in quella discussione non sono chiare.

È stato utile?

Soluzione

Va ??bene, rivisitando questa domanda con la mia risposta fornendo un piccolo script VB che farà tutto il lavoro pesante. Come accennato nella domanda originale, l'obiettivo era fornire una soluzione semplice per gli utenti di sysadmin per effettuare autonomamente gli aggiornamenti / le modifiche.

Di seguito è riportata una versione semplificata del codice che sto attualmente fornendo ai clienti

Option Explicit

Const MY_CONFIG = "MyConfigApp.xml"
Const CAB_FILE = "config.cab"
Const MSI = "MyApp.msi"

Dim filesys : Set filesys=CreateObject("Scripting.FileSystemObject")

If filesys.FileExists("temp.tmp") Then filesys.DeleteFile("temp.tmp")
filesys.CopyFile MSI, "temp.tmp"

Dim installer, database, database2, view
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase ("temp.tmp", 1)
Set database2 = installer.OpenDatabase (MSI, 1)

If Not filesys.FileExists(MY_CONFIG) Then WScript.Quit 2 ' No config file, abort!

Dim objFile, size, result, seq, objCab

' MakeCab object has been depreciated so we fallback to makecab.exe for with Windows 7
On Error Resume Next ' Disable error handling, for a moment
Set objCab = CreateObject("MakeCab.MakeCab.1") 
On Error Goto 0  ' Turn error handling back on

If IsObject(objCab) Then ' Object creation successful - use XP method   
    objCab.CreateCab CAB_FILE, False, False, False
    objCab.AddFile MY_CONFIG, filesys.GetFileName(MY_CONFIG)
    objCab.CloseCab
    Set objCab = Nothing
Else ' object creation failed - try Windows 7 method
    Dim WshShell, oExec
    Set WshShell = CreateObject("WScript.Shell")
    Set oExec = WshShell.Exec("makecab " & filesys.GetFileName(MY_CONFIG) & " " & CAB_FILE)
End If

Set objFile = filesys.GetFile(MY_CONFIG)
size = objFile.Size

Set view = database.OpenView ("SELECT LastSequence FROM Media WHERE DiskId = 1")
view.Execute
Set result = view.Fetch
seq = result.StringData(1) + 1 ' Sequence for new configuration file

Set view = database.OpenView ("INSERT INTO Media (DiskId, LastSequence, Cabinet) VALUES ('2', '" & seq & "', '" & CAB_FILE & "')")
view.Execute

Set view = database.OpenView ("UPDATE File SET FileSize = " & size & ", Sequence = " & seq & ", FileName = 'MYC~2.CNF|MyConfigApp.xml' WHERE File = '" & MY_CONFIG & "'")
view.Execute

database.GenerateTransform database2, "CustomConfig.mst"
database.CreateTransformSummaryInfo database2, "CustomConfig.mst", 0, 0
filesys.DeleteFile("temp.tmp")

Set view = nothing
Set installer = nothing
Set database = nothing
Set database2 = nothing
Set filesys = Nothing
WScript.Quit 0

Aggiornamento: l'oggetto MakeCab.MakeCab.1 è stato deprezzato, il codice aggiornato ora funziona con Windows 7.

Altri suggerimenti

Suppongo che tu stesso crei il file msi (?)

Quando usi Wix per generare il tuo msi, il cliente può semplicemente rigenerare l'intero msi dopo aver sostituito il file (wix è gratuito). Altrimenti dovrebbe essere possibile utilizzare un file non compresso che non è incorporato nell'MSI. In wix devi aggiungere un elemento multimediale senza un attributo cabinet. Lo svantaggio è che devi distribuire due file, anziché un singolo msi.

IMHO questo tipo di scenario indica una funzione mancante nell'applicazione che si sta installando ed è più facile da risolvere nell'applicazione che non hackerare con l'MSI.


Immagine amministratore

Lasciatemi prima dire che un modo semplice per " risolvere " questo per i tuoi utenti, è dire loro di eseguire un'installazione amministrativa del tuo MSI. Questo essenzialmente estrarrà tutti i file dai CAB interni e inserirà tutti i file nella cartella specificata:

msiexec.exe / a myinstaller.msi TARGETDIR = C: \ AdminImage

I tuoi utenti possono quindi accedere direttamente alla struttura delle cartelle estratte e aggiornare il file in questione, quindi mappare la directory su altri PC e installare l'MSI. Potrebbero esserci effetti collaterali a questo riguardo al file con un valore di hash nell'MSI (per evitare lo spoofing), ma nella maggior parte dei casi funziona bene.


Esegui query XPath XML

Le nuove versioni di strumenti di distribuzione come InstallShield e Wix offrono il supporto integrato per l'esecuzione di query XPath durante l'installazione e quindi la scrittura dinamica delle sezioni.


Aggiornamento dell'applicazione

La configurazione di un'applicazione su un PC prevede diversi passaggi. Prima di tutto c'è la distribuzione di contenuti sulla macchina - questo dovrebbe essere fatto usando un MSI, nessuna domanda al riguardo. Tuttavia, nella maggior parte delle applicazioni avanzate diverse "attività di configurazione post installazione" simile a questo "aggiornamento del file di configurazione" sono obbligatori.

È quasi sempre meglio rinviare queste attività di configurazione fino al avvio dell'applicazione , piuttosto che implementare funzionalità nell'MSI. Ci sono molte ragioni per questo, ma la cosa più importante è che solo l'applicazione EXE sarà garantita nel corretto contesto dell'utente. I file MSI possono essere eseguiti con diritti di sistema, un account utente diverso o tramite qualche altro meccanismo.

Ciò che generalmente consigliamo è di utilizzare l'MSI per ottenere tutti i contenuti richiesti sul PC . Quindi taggare il registro per indicare all'applicazione che è il primo avvio (per gli aggiornamenti, è possibile incrementare un contatore o scrivere il nuovo numero di versione su HKLM). Quindi l'applicazione può eseguire le fasi finali di configurazione nella sua routine di avvio. Può copiare un file config.xml predefinito da qualche parte in% ProgramFiles% e copiarlo nel profilo utente. Quindi può leggere i valori richiesti da HKLM scritti dall'MSI e quindi aggiornare il file config.xml con questi valori.

In generale: evitare i passaggi di configurazione eseguiti da MSI o qualsiasi altro meccanismo di installazione. Concentrati sulla scrittura dei file e degli elementi di registro richiesti sul computer, quindi lascia che l'applicazione stessa configuri un ambiente di runtime adeguato. Ciò consentirà un controllo della distribuzione molto migliore. È meglio " Incapsulamento " se ti piace. L'MSI invia un "messaggio" all'applicazione tramite il registro e l'applicazione sa "come configurarsi correttamente" in base ai messaggi.

Devi aggiungere una voce alla tabella Media , aggiungendo un altro supporto senza file CAB e LastSequence uno in più rispetto all'ultima sequenza del file CAB. È quindi necessario sostituire nella File la sequenza del file con il nuovo file e aggiorna tutti gli altri attributi del file che potrebbero essere stati modificati.

Controlla il seguente messaggio: Come sostituire un file in un programma di installazione msi?

Dove viene menzionato:

Questo comando estrae i file MSI: msi2xml -c OutputDir TestMSI.MSI

Apri OutputDir e modifica il file.

Per ricostruire l'esecuzione MSI: xml2msi.exe -m TestMSI.xml

È necessario il -m per ignorare il "test checksum MD5" che fallisce quando un file MSIs viene modificato.

Download: https://msi2xml.sourceforge.io/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top