Crear instalador de programa a partir de su instalación?

Iniciado por 1mpuls0, 20 Marzo 2014, 20:27 PM

0 Miembros y 1 Visitante están viendo este tema.

1mpuls0

Hola.
Un proveedor de mi trabajo nos instaló un software el cual no se encuentra disponible en su página web.

La instalación la realizó en una máquina virtual lo cual para mi es muy molesto.

Me preguntaba si hay alguna manera de crear el instalador a partir de la instalación ya hecha en la máquina virtual.

Investigué un poco y encontré comentarios a cerca de un software llamado Inno Setup Compiler, pero me gustaría escuchar sus opiniones.

La máquina virtual tiene SO Win XP y donde me gustaría instalarlo es en W7 hasta donde sé no hay problemas de compatibilidad.

Solo que lo instalaron así por detalles de memoria (con respecto a XP)

Alguna idea de como hacerlo?

Gracias!
abc

Eleкtro

#1
Hola

Yo hago mis propios instaladores desde hace varios años con Inno Setup, si quieres pásame por privado los archivos de ese Software y te hago un installer en pocos minutos.

Pero hay ciertas cosas a tener en cuenta:

Desconozco que tipo de programa es, ni la complejidad de la instalación original realizada, es decir, aparte de la carpeta de instalación, que segúramente se encontrará aquí:


C:\Program Files\
C:\Program Files(x86)\



es posible que el programa puede depender de varios archivos expandidos por diversas carpetas, ya sean librerías, archivos de configuración, drivers, u otro tipo de archivos, que suelen estar en alguna(s) de estas carpetas:


C:\ProgramData
C:\Program Files\Common Files
C:\Program Files (x86)\Common Files
C:\Users\Administrador\AppData\Local
C:\Users\Administrador\AppData\Roaming
C:\Windows\System32
C:\Windows\SysWow64


Así que, a menos que el programa sea 'sencillito' y estés seguro que el programa no ha expandido ningún archivo en esas carpetas... debes buscar indicios en todos esos directorios, y si se tratan de archivos críticos (es decir, si el programa no funciona sin esos archivos expandidos) debes agregarlos al archivo de instalación para expandirlos al mismo directorio en tu nuevo instalador personalizado.

A parte también cabría laposibilidad de que el programa registre algún tipo de servicio, o dll/ocx.

Y además es posible que guarde su configuración y/o claves de licencias (si es que tienes alguna) en el registro de Windows.

En realidad hablo por hablar, solo comento algunas de las posibles variables que hay que tener en cuenta para hacer un instalador, porque desconozco el grado de complejidad de la instalación original de ese programa, que quizás con copiar la carpeta de instalación (en: c:\Program Files\...) sea más que suficiente, pero también podría ser que no sea el caso.


Edito:

Si no estás seguro de cuantos archivos son en total entonces te recomiendo que, en la VirtualMachine, si tienes el instalador original, inicies el proceso de instalación, usa la herramienta Regshot para monitorizar los cambios en el registro y la herramienta Mooo file monitor (por decirte alguna) para monitorizar los archivos expandidos por el instalador, y con eso, en la mayoría de casos, ya tendrás todo el material necesario para hacer tu propio instalador a partir del instalador original.
PD: Cualquier Tracer del registro y de archivos te sirve para la tarea.

Edito 2:
Otra cosa que casi se me olvida...
Antes de hacer nada asegúrate que el instalador orignal no sea un InnoSetup, porque entonces lo puedes desempaquetar con la herramienta InnoUnpack y ya tendrías todo el trabajo echo.







Bueno, de todas formas te voy a dejar la plantilla que yo hice para usar por defecto en un nuevo proyecto en Inno Setup, por si te sirve de ayuda y prefieres hacerlo por ti mismo.

Esta plantilla está echa en Inno Setup usando la IDE IsTool, si quieres mi opinión ...hay que estar loco para querer usar Inno Setup por si solo ya que es como escribir un código fuente en Notepad, muy poco productivo, y con esta IDE ahorras mucho tiempo y te facilita todas las tareas.

InnoSetup ~> http://www.jrsoftware.org/isdl.php
IsTool ~> http://sourceforge.net/projects/istool/files/1.%20ISTool/release-5.3.0.1/

Como verás hay mucho código, esto es así, en Inno setup hay que codearlo todo, para gustos colores, existen infinidad de InstallBuilders donde prácticamente no tienes que escribir nada, todo se hace a base de 'clicks' (elegir archivos, carpetas, etc), pero a mi personálmente no me gustan nada, me hacen perder más tiempo que si yo escribo por mi mismo cada parametro, atributo, archivo, etc.


Plantilla.iss
Código (inno) [Seleccionar]
; = = = = = = = = = = = = = = = = = = =
; Default Template ( by Elektro )      |
;                                      |
;            InnoSetup 5.5.4           |
; = = = = = = = = = = = = = = = = = = =

[Setup]

; ----
; Info
; ----
#define Name "Application"
#define Version "1.0"
#define EXE "Application.exe"
AppName={#Name}
AppVersion={#Version}
AppVerName={#Name} {#Version}
AppCopyright=Elektro H@cker
AppPublisher=Elektro H@cker

; -----
; Paths
; -----
DefaultDirName={pf}\{#Name}
DefaultGroupName={#Name}
OutputDir=.\Output\
OutputBaseFilename={#Name}
UninstallDisplayIcon={app}\{#EXE}

; -----------
; Compression
; -----------
Compression=lzma/ultra
InternalCompressLevel=Ultra
SolidCompression=True
;DiskSpanning=true
;DiskSliceSize=2100000000

; ----------
; Appearance
; ----------
AlwaysShowComponentsList=False
DisableDirPage=True
DisableProgramGroupPage=True
DisableReadyPage=True
DisableStartupPrompt=True
FlatComponentsList=False
LanguageDetectionMethod=None
PrivilegesRequired=PowerUser
RestartIfNeededByRun=False
ShowLanguageDialog=NO
ShowTasksTreeLines=True
Uninstallable=True
ArchitecturesAllowed=x86 x64
;ArchitecturesInstallIn64BitMode=x64

; ---------
; Resources
; ---------
SetupIconFile=Icon.ico
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp
InfoBeforeFile=embedded\InfoBefore.rtf
;InfoBeforeFile=embedded\InfoBefore.txt


[Languages]
Name: english; MessagesFile: compiler:Languages\English.isl
;Name: spanish; MessagesFile: compiler:Languages\Spanish.isl


[Dirs]
;{sd}                  = 'C:\'
;
;{commonappdata}       = 'C:\ProgramData'
;{localappdata}        = 'C:\Users\UserName\AppData\Local'
;{userappdata}         = 'C:\Users\UserName\AppData\Roaming'
;
;{pf}                  = 'C:\Program Files' (On x86 machine) | 'C:\Program Files (x86)' (On x64 machine)
;{pf32}                = 'C:\Program Files (x86)' (Only can be used on x64 machine)
;{pf64}                = 'C:\Program Files'       (Only can be used on x64 machine)
;
;{cf}                  = 'C:\Program Files\Common Files' (On x86 machine) | 'C:\Program Files (x86)\Common Files' (On x64 machine)
;{cf32}                = 'C:\Program Files (x86)\Common Files' (Only can be used on x64 machine)
;{cf64}                = 'C:\Program Files\Common Files' (Only can be used on x64 machine)
;
;{win}                 = 'C:\Windows'
;{fonts}               = 'C:\Windows\Fonts'
;{sys}                 = 'C:\Windows\System32'
;{syswow64}            = 'C:\Windows\SysWow64' (Only can be used on x64 machine)
;
;{%userprofile}        = 'C:\Users\UserName'
;{userdesktop}         = 'C:\Users\UserName\Desktop'
;{userdocs}            = 'C:\Users\UserName\Documents'
;
;{commonstartmenu}     = 'C:\ProgramData\Microsoft\Windows\Start Menu'
;{userstartmenu}       = 'C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Start Menu'
;
;{sendto}              = 'C:\Users\UserName\AppData\Roaming\Microsoft\Windows\SendTo'


[Files]
Source: {tmp}\*; DestDir: {tmp}; Flags: deleteafterinstall
Source: {app}\*; DestDir: {app}; Flags: recursesubdirs createallsubdirs ignoreversion

;Source: {app}\*.*; DestDir: {app}; DestName:; Attribs:; Flags:;
;
;Attribs: ReadOnly Hidden System
;
;DestName: Example.exe
;
;Flags: 32bit 64bit Deleteafterinstall IgnoreVersion NoCompression Onlyifdoesntexist recursesubdirs createallsubdirs uninsneveruninstall


[Registry]
;Root: HKCR; Subkey: SystemFileAssociations\.ext\Shell\OPTION; ValueName: Icon; ValueType: String; ValueData: {app}\{#Exe}; Flags: ; uninsdeletevalue
;Root: HKCR; Subkey: SystemFileAssociations\.ext\Shell\OPTION\Command; ValueType: String; ValueData: """{app}\{#Exe}"" ""%1"""; Flags: ; uninsdeletevalue
;
;Flags: uninsdeletevalue uninsdeletekey


[Tasks]
;Name: Identifier; Description: Title; GroupDescription: Group; Flags:;
;
;Flags: Unchecked


[Run]
Filename: {app}\{#Exe}; Description: {cm:LaunchProgram,{#Name}}; Flags: NoWait PostInstall SkipIfSilent ShellExec Unchecked

;Filename: {cmd}; Parameters: "/C command"; StatusMsg: "Installing..."; Flags: RunHidden WaitUntilTerminated
;
;Flags: 32bit 64bit RunHidden WaitUntilTerminated NoWait PostInstall SkipIfSilent ShellExec Unchecked


[Icons]
Name: {userstartmenu}\Programs\{#Name}; Filename: {app}\{#Exe}; IconFilename: {app}\{#Exe}; WorkingDir: {app}


[Code]

const
 Custom_Height = 440;
 Custom_ProgressBar_Height = 20;
 Page_Color = clwhite;
 Page_Color_Alternative1 = clblack;
 Page_Color_Alternative2 = clwhite;
 Font_Color = clblack;


var
 DefaultTop,
 DefaultLeft,
 DefaultHeight,
 DefaultBackTop,
 DefaultNextTop,
 DefaultCancelTop,
 DefaultBevelTop,
 DefaultOuterHeight: Integer;


procedure InitializeWizard();
begin

 DefaultTop := WizardForm.Top;
 DefaultLeft := WizardForm.Left;
 DefaultHeight := WizardForm.Height;
 DefaultBackTop := WizardForm.BackButton.Top;
 DefaultNextTop := WizardForm.NextButton.Top;
 DefaultCancelTop := WizardForm.CancelButton.Top;
 DefaultBevelTop := WizardForm.Bevel.Top;
 DefaultOuterHeight := WizardForm.OuterNotebook.Height;


 // Pages (Size)
 WizardForm.Height := Custom_Height;
 WizardForm.InnerPage.Height := WizardForm.InnerPage.Height + (Custom_Height - DefaultHeight);
 WizardForm.LicensePage.Height := WizardForm.LicensePage.Height + (Custom_Height - DefaultHeight);


 // Pages (Color)
 WizardForm.color := Page_Color_Alternative1;
 WizardForm.FinishedPage.Color  := Page_Color;
 WizardForm.InfoAfterPage.Color := Page_Color;
 WizardForm.InfoBeforePage.Color := Page_Color;
 WizardForm.InnerPage.Color := Page_Color;
 WizardForm.InstallingPage.color := Page_Color;
 WizardForm.LicensePage.Color := Page_Color;
 WizardForm.PasswordPage.color := Page_Color;
 WizardForm.PreparingPage.color := Page_Color;
 WizardForm.ReadyPage.Color := Page_Color;
 WizardForm.SelectComponentsPage.Color  := Page_Color;
 WizardForm.SelectDirPage.Color  := Page_Color;
 WizardForm.SelectProgramGroupPage.color := Page_Color;
 WizardForm.SelectTasksPage.color := Page_Color;
 WizardForm.UserInfoPage.color := Page_Color;
 WizardForm.WelcomePage.color := Page_Color;


 // Controls (Size)
 WizardForm.InfoAfterMemo.Height := (Custom_Height - (DefaultHeight / 2));
 WizardForm.InfoBeforeMemo.Height := (Custom_Height - (DefaultHeight / 2));
 WizardForm.InnerNotebook.Height :=  WizardForm.InnerNotebook.Height + (Custom_Height - DefaultHeight);
 WizardForm.LicenseMemo.Height := WizardForm.LicenseMemo.Height + (Custom_Height - DefaultHeight);
 WizardForm.OuterNotebook.Height := WizardForm.OuterNotebook.Height + (Custom_Height - DefaultHeight);
 WizardForm.ProgressGauge.Height := Custom_ProgressBar_Height
 WizardForm.ReadyMemo.Height := (Custom_Height - (DefaultHeight / 2));
 WizardForm.Taskslist.Height := (Custom_Height - (DefaultHeight / 2));
 WizardForm.WizardBitmapImage.Height := (Custom_Height - (DefaultHeight - DefaultBevelTop));
 WizardForm.WizardBitmapImage2.Height  := (Custom_Height - (DefaultHeight - DefaultBevelTop));


 // Controls (Location)
 WizardForm.BackButton.Top := DefaultBackTop + (Custom_Height - DefaultHeight);
 WizardForm.Bevel.Top := DefaultBevelTop + (Custom_Height - DefaultHeight);
 WizardForm.CancelButton.Top := DefaultCancelTop + (Custom_Height - DefaultHeight);
 WizardForm.LicenseAcceptedRadio.Top := WizardForm.LicenseAcceptedRadio.Top + (Custom_Height - DefaultHeight);
 WizardForm.LicenseNotAcceptedRadio.Top := WizardForm.LicenseNotAcceptedRadio.Top + (Custom_Height - DefaultHeight);
 WizardForm.NextButton.Top := DefaultNextTop + (Custom_Height - DefaultHeight);
 WizardForm.Top := DefaultTop - (Custom_Height - DefaultHeight) div 2;
 //WizardForm.ProgressGauge.Top := (DefaultHeight / 2)


 // Controls (Back Color)
 WizardForm.DirEdit.Color  := Page_Color_Alternative2;
 WizardForm.GroupEdit.Color  := Page_Color_Alternative2;
 WizardForm.InfoAfterMemo.Color := Page_Color_Alternative2;
 WizardForm.InfoBeforeMemo.Color := Page_Color_Alternative2;
 WizardForm.LicenseMemo.Color := Page_Color_Alternative2;
 WizardForm.MainPanel.Color := Page_Color;
 WizardForm.PasswordEdit.Color  := Page_Color_Alternative2;
 WizardForm.ReadyMemo.Color := Page_Color_Alternative2;
 WizardForm.Taskslist.Color := Page_Color;
 WizardForm.UserInfoNameEdit.Color  := Page_Color_Alternative2;
 WizardForm.UserInfoOrgEdit.Color  := Page_Color_Alternative2;
 WizardForm.UserInfoSerialEdit.Color  := Page_Color_Alternative2;


 // Controls (Font Color)
 WizardForm.FinishedHeadingLabel.font.color  := Font_Color;
 WizardForm.InfoafterMemo.font.Color  := Font_Color;
 WizardForm.FinishedLabel.font.color  := Font_Color;
 WizardForm.DirEdit.font.Color  := Page_Color_Alternative1;
 WizardForm.GroupEdit.font.Color  := Page_Color_Alternative1;
 WizardForm.LicenseMemo.font.Color  := Page_Color_Alternative1;
 WizardForm.MainPanel.font.Color := Font_Color;
 WizardForm.PageDescriptionLabel.font.color  := Font_Color;
 WizardForm.PageNameLabel.font.color  := Font_Color;
 WizardForm.PasswordEdit.font.Color  := Page_Color_Alternative1;
 WizardForm.Taskslist.font.Color  := Font_Color;
 WizardForm.UserInfoNameEdit.font.Color  := Page_Color_Alternative1;
 WizardForm.UserInfoOrgEdit.font.Color  := Page_Color_Alternative1;
 WizardForm.UserInfoSerialEdit.font.Color  := Page_Color_Alternative1;
 WizardForm.WelcomeLabel1.font.color  := Font_Color;
 WizardForm.WelcomeLabel2.font.color  := Font_Color;
 WizardForm.ReadyMemo.font.Color := Page_Color_Alternative1;
 // These properties disables HyperLinks:
 //
 //WizardForm.Font.color := Font_Color;
 //WizardForm.InfoBeforeMemo.font.Color  := Page_Color_Alternative1;

end;
[/code]









1mpuls0

#3
@Eleкtro

Intenté hacerlo con Inno Setup, pero algo debí hacer mal xD
Es una herramienta llamada "WebFOCUS Developer Studio" la instalación la realizaron en "C:\ibi" (IBI -> Information Builders Intelligence)

Dentro de "ibi" se encuentran 3 carpetas: apps (que es donde se guardan las aplicaciones creadas), tomcat (servidor) y DevStudio80 (el programa en cuestion)

¿Cómo puedo saber si además de estas carpetas el programa depende de otras?

Bueno, con respecto a esta pregunta estuve realizando busquedas y espero haya sido suficiente pero encontré una carpeta que hasta mi parecer podría ser parte de la instalación.

Se encuentra en "C:\Archivos de programa\InstallShield Installation Information\IBITomcat" en realidad solo tiene el desinstalador de tomcat e.e
Tambien encontré un directorio vacio en "C:\Documents and Settings\Administrador\Configuración local\Temp\ibitmpopen" (aunque creo qeu eso es de los archivos temporales)

Realicé una busqueda (extraño el buscador de xp) por fecha de creación y la mayoría salieron archivos de la carpeta "ibi"  :D a pesar de que los archivos de instalación de xp tienen la misma fecha.

Una forma que se me ocurre (un poco tediosa) es utilizar un desinstalador como Revo Uninstaller Pro, el cual al momento de la desinstalación muestra los directorios de los componentes de ese programa instalados en otro directorio.

Las licencias se como encontrarlas (6) (las memoricé mientras registraban el programa, en realidad no son complicadas)

El instalador no lo tengo T.T en la vm


Cuando hice el instalador con Inno Setup parecia todo bien en la instalación pero al ejecutar el programa me dice que falta una librería "RattleTool.dll" pero esa se encuentra dentro del directorio "C:\ibo\DevStudio80\bin\RattleTool.dll" ¬¬ que es la que se supone que incluí en el Inno Setup ("C:\ibi\")
Entonces copie esa librería pero el programa sigue diciendo que falta la  librería xD


Otra cosa, se supone que cuando utilicé Inno Setup incluí el tomcat y el apps (de hecho inclui toda la carpeta ibi) pero no salen en la instalación ._.


Me gustaría volver a intentar tomando en cuenta lo que mencionas. Si no... creo que si pediré tu ayuda y te pasaré los archivos para que me ayudes xD


@Randomize
No puedo ver las imagenes de ese post :/ ya sabes luego te bloquean páginas en el trabajo :P
De todos modos si no puedo con inno setup intentaré como lo mencionas.


Ya aviso como va esto.

Gracias chicos!

Edito:
Intenté nuevamente con Inno Setup y no sé porque p*/$ no copia las otras carpetas. Como dije antes algo debo hacer mal, aunque al instalar se muestran los archivos de tomcat.

Voy a probar con el método de Randomize

Por cierto esta es la página del programa:
http://www.informationbuilders.com/products/webfocus/wf_developer_studio
abc

Eleкtro

#4
CitarCuando hice el instalador con Inno Setup parecia todo bien en la instalación pero al ejecutar el programa me dice que falta una librería "RattleTool.dll" pero esa se encuentra dentro del directorio "C:\ibo\DevStudio80\bin\RattleTool.dll" ¬¬ que es la que se supone que incluí en el Inno Setup ("C:\ibi\")
Entonces copie esa librería pero el programa sigue diciendo que falta la  librería xD

Prueba a colocar la dll en C:\Windows\System32 (si tu SO es x86) y registrala (Regsvr32.exe "C:\Windows\system32\RattleTool.dll") aunque no creo que eso vaya a funcionar.

Es posible que esa dll diga que no la encuentre porque quizás esté intentando tomar la ubicación del archivo, o de la carpeta bin, desde alguna clave del registro... así que haz una búsqueda por "RattleTool.dll", "bin", y "DevStudio" en el registro a ver si encuentras algo.

Te recomiendo la herramienta Registry Workshop como reemplazamiento completo del regedit, te ahorrará este tipo de tareas.

Te digo las claves más comunes donde pueden haber rastros del programa:
HKEY_CURRENT_USER\Software\NombreDelPrograma
HKEY_LOCAL_MACHINE\SOFTWARE\NombreDelPrograma
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\NombreDelPrograma




Citar@Randomize
No puedo ver las imagenes de ese post :/ ya sabes luego te bloquean páginas en el trabajo :P
De todos modos si no puedo con inno setup intentaré como lo mencionas.
La solución de Rando es muy buena, es un Tracer, es decir, rastrea todos los cambios que el instalador hace en el sistema, por lo tanto no puedes usarlo en este caso xD.

PD: El tracer del programa Uninstall Tool también está muy bien: http://www.crystalidea.com/install-tracker-installation-monitor



Citar¿Cómo puedo saber si además de estas carpetas el programa depende de otras?
Pues... puf, sin el instalador original va a resultar bastante más tedioso, pero con paciencia se puede averiguar.

Puedes utilizar el Process monitor u otros programas como Dependency Walker para espiar las DLL que el programa carga al inicio y así sabrás de que archivos depende el software.

Process monitor: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx
Dependency Walker: http://www.dependencywalker.com/



Saludos








1mpuls0

Eleкtro

Gracias por tu respuesta, intentaré lo más posible porque en verdad necesito el instalable.

En cuanto tenga alguna duda comento.

Saludos.
abc