2014-06-30 30 views
15

Sono nuovo di wix installer. Ho sviluppato un set-up usando wix installer per la mia applicazione e ho bisogno di eseguire un'azione personalizzata per eseguire un comando in cmd.exe. In XP funziona perfettamente. Ma in Windows 8 & 7 il prompt cmd deve essere eseguito come amministratore.Esegui ExeCommand in CustomAction come modalità amministratore in Wix Installer

Ho cercato su Google e ho trovato le parole chiave Elevati privilegi e impersonare potrebbe aiutarmi.

<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" InstallPrivileges="elevated"></Package> 

Come potete vedere sopra, ho usato l'attributo InstallScope impostato perMachine, e ho usato impersonate = "No" nell'elemento CustomAction:

<CustomAction Id='comReg' Directory='INSTALLLOCATION' Impersonate='no' 
    ExeCommand='"[NETFRAMEWORK40CLIENTINSTALLROOTDIR]regasm.exe" "[INSTALLLOCATION]myProduct.dll" /codebase' Return='check' /> 

Ma non ho avuto alcun cambia durante l'installazione. Ho bisogno del prompt dei comandi per aprire ed eseguire il comando sopra in modalità amministratore.

E qualcuno può dirmi di queste parole chiave "privilegi elevati & IMPERSONATE"

<InstallExecuteSequence> 
    <Custom Action='comReg' After='InstallFinalize'>NOT REMOVE</Custom> 
    <Custom Action='comUnreg' Before='RemoveFiles'>REMOVE</Custom> 
</InstallExecuteSequence> 

come farlo?

risposta

26

Il wix documentation here spiega l'attributo Rappresenta:

Questo attributo specifica se il Windows Installer, che esegue come LocalSystem, dovrebbe impersonare contesto utente dell'utente l'installazione durante l'esecuzione di questa azione personalizzata. In genere il valore deve essere "sì", tranne quando l'azione personalizzata richiede privilegi elevati per applicare modifiche alla macchina.

È inoltre necessario comprendere la differenza tra azioni personalizzate differite e immediate. Vedere l'attributo Execute nella stessa pagina di aiuto:

Questo attributo indica la pianificazione dell'azione personalizzata. Il valore di questo attributo deve essere uno dei seguenti:

differita Indica che l'azione personalizzata viene eseguito in-script (possibilmente con privilegi elevati). immediato Indica che l'azione personalizzata verrà eseguita durante il normale tempo di elaborazione con i privilegi dell'utente. Questo è l'impostazione predefinita.

Attualmente l'azione personalizzata è immediata, il che significa che è in esecuzione con i privilegi dell'utente. Vedere this blog post per un sacco di dettagli, ma in particolare:

eventuali azioni personalizzate immediate rappresentare l'utente che esegue il richiamo. Prima di Windows Vista questo non rappresentava un problema dato che a questo punto l'utente amministrativo di installazione aveva un token privilegiato. Con l'introduzione di Controllo dell'account utente in Windows Vista, il token di amministrazione predefinito con UAC abilitato è un token filtrato e non contiene tutti i privilegi. Dal le azioni personalizzate immediate non dovrebbero modificare lo stato della macchina - solo per raccogliere dati sullo stato e pianificare azioni personalizzate da eseguire differite - questo non dovrebbe essere un problema.Dopotutto, a questo punto la generazione degli script di installazione e rollback è tutto ciò che dovrebbe succedere.

Non si dovrebbe mai modificare lo stato della macchina con un'azione personalizzata immediata. Utilizzare uno differita, e continuare a impersonare a nessuno, e dovrebbe funzionare:

<CustomAction Id='comReg' Directory='INSTALLLOCATION' Execute='deferred' Impersonate='no' ExeCommand='"[NETFRAMEWORK40CLIENTINSTALLROOTDIR]regasm.exe" "[INSTALLLOCATION]EAWordImporter.dll" /codebase' Return='check' /> 

EDIT: Pianificare l'azione personalizzata utilizzando l'elemento InstallExecuteSequence:

<InstallExecuteSequence> 
    <Custom Action='comReg' Before='InstallFinalize'/> 
</InstallExecuteSequence> 
+0

mi mostra un errore come errore ICE77: comReg è un'azione personalizzata in-script. Deve essere messo in sequenza tra l'azione InstallInitialize e l'azione InstallFinalize nella tabella InstallExecuteSequence @tjleigh – Arshad

+0

Dove hai programmato l'azione personalizzata? Guarda l'elemento ''. Come afferma l'errore, deve essere tra InstallInitialize e InstallFinalize. Probabilmente lo metterò 'Before =" InstallFinalize "'. – tjleigh

+0

@ tjleigh: Ho modificato la mia domanda, puoi aiutarmi per favore da questo.! – Arshad