Объединение нескольких установок в MSI

Я использую «MSI Wrapper v5.1.89.0» от exemsi.com для преобразования установки, созданной с помощью «Inno Setup Compiler v5.5.5(a)».

Скрипт для установки выглядит следующим образом:

[Setup]
AppName=Personal Time Keeping
AppVersion=1.0.2.1
DefaultDirName={pf}\PTK
DefaultGroupName=group name
UninstallDisplayIcon={app}\ptk.exe
Compression=lzma2
SolidCompression=yes
OutputDir=userdocs:Inno Setup Examples Output
; "ArchitecturesInstallIn64BitMode=x64" requests that the install be
; done in "64-bit mode" on x64, meaning it should use the native
; 64-bit Program Files directory and the 64-bit view of the registry.
; On all other architectures it will install in "32-bit mode".
ArchitecturesInstallIn64BitMode=x64
; Note: We don't set ProcessorsAllowed because we want this
; installation to run on all architectures (including Itanium,
; since it's capable of running 32-bit code too).

[InstallDelete]
Type: files; Name: "{userappdata}\Microsoft\Windows\Start Menu\Programs\Startup\ptk.exe -   Shortcut.lnk"

[Files]
;Ensure all the prerequisites are installed
Source: "C:\3subTimeKeeingApp\3sunptk\prerequisites\NDP451-KB2858728-x86-x64-AllOS-ENU.exe"; Check: needsFramework; DestDir: "{tmp}"; DestName: "NDP451.exe"; Flags: deleteafterinstall; 
Source: "C:\3subTimeKeeingApp\3sunptk\prerequisites\VisualBasicPowerPacks3Setup.exe"; Check: needsPowerPacks; DestDir: "{tmp}"; DestName: "VBPP3.exe"; Flags: solidbreak
Source: "C:\3subTimeKeeingApp\3sunptk\prerequisites\sharepointclientcomponents_x64.msi"; Check: (IsWin64 and needsSharePtClient); DestDir: "{tmp}"; DestName: "sharept.msi"; Flags: solidbreak
Source: "C:\3subTimeKeeingApp\3sunptk\prerequisites\sharepointclientcomponents_x86.msi"; Check: ((not IsWin64) and needsSharePtClient); DestDir: "{tmp}"; DestName: "sharept.msi"; Flags: solidbreak
Source: "C:\3subTimeKeeingApp\3sunptk\prerequisites\mysql-connector-net-6.8.3.msi"; Check: needsMySQLNET; DestDir: "{tmp}"; DestName: "mysqlNET.msi"; Flags: solidbreak
Source: "C:\3subTimeKeeingApp\3sunptk\prerequisites\mysql-connector-odbc-5.3.2-win32.msi"; Check: needsMySQLODBC; DestDir: "{tmp}"; DestName: "mysqlODBC.msi"; Flags: solidbreak
;The application to install
Source: "C:\3subTimeKeeingApp\3sunptk\3sunptk\bin\Release\3sunptk.exe"; DestDir: "{app}"; BeforeInstall: CloseApp('3sunptk.exe');
;Transfer reports folders and files
Source: "C:\3subTimeKeeingApp\3sunptk\report\*"; DestDir: "{app}\report"; Flags: ignoreversion recursesubdirs

[Run]
;Uninstall of older verison of 'Personal TimeKeeping' application
Filename: "{sys}\rundll32.exe"; Parameters: "dfshim.dll,ShArpMaintain 3sunptk.application, Culture=en-GB, PublicKeyToken=077ce3637efc8b1c, processorArchitecture=msil"; Check: isOldStyleInstalled; StatusMsg: Uninstalling older version of Personal Timekeeping; Flags: runascurrentuser;
;Install the MSI's quietly "/passive /norestart /q:a /c:""install /l /q"""
Filename: {tmp}\NDP451.exe; Parameters: "/passive /norestart /c:""install /l /q"""; StatusMsg: Microsoft Framework 4.5.1 is being installed. Please wait..                  
Filename: "{tmp}\VBPP3.exe"; Parameters: "/s /v""/qb"""; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg: Installing Visual Basic Power Packs 3.
Filename: "msiexec.exe"; Parameters: "/quiet /i ""{tmp}\sharept.msi"""; StatusMsg: Installing Sharepoint client tools.
Filename: "msiexec.exe"; Parameters: "/quiet /i ""{tmp}\mysqlNET.msi"""; StatusMsg: Installing mySQL .NET connector.
Filename: "msiexec.exe"; Parameters: "/quiet /i ""{tmp}\mysqlODBC.msi"""; StatusMsg: Installing mySQL ODBC connector.
;Start the application
Filename: "{app}\3sunPTK.exe"; Description: "Launching 3sun Personal Timekeeping"; Flags: nowait postinstall skipifsilent;

[Icons]
Name: "{commonstartup}\3sun Personal Timekeeping"; Filename: "{app}\3sunPTK.exe"

[Code]
//--------------------------------------------------------------------------------
// Visual Basic Power Packs
//--------------------------------------------------------------------------------
function isVBPowerPacks3installed(): Boolean;
    var 
        success: Boolean;
        productName: String;
    begin
        success := RegQueryStringValue(HKCU, 
            'Software\Microsoft\Installer\Products\B391D4B7D67DB803B821D5B91BBCECC6', 
            'ProductName', 
            productName);
        Result := success and (productName = 'Microsoft Visual Basic Power Packs 3.0');
    end;

function needsPowerPacks(): Boolean;
    begin
        Result := (isVBPowerPacks3installed = False);
    end;  
//--------------------------------------------------------------------------------
// .NET helpers
//--------------------------------------------------------------------------------
function isDotNet451Detected(): Boolean;
    var 
        success: Boolean;
        release: Cardinal;
    begin
        success := RegQueryDWordValue(HKLM, 
                    'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\', 
                    'Release', 
                    release);
//For .net versions
//http://msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx#net_b 
        Result := success and (release = 378758);
    end;

function needsFramework(): Boolean;
    begin
        Result := (isDotNet451Detected = False);
    end;
//--------------------------------------------------------------------------------
// MySQL .NET connector 6.8.3
//--------------------------------------------------------------------------------
function isMySQLNETconnectorInstalled(): Boolean;
    var 
        success: Boolean;
        version: String;
    begin
        success := RegQueryStringValue(HKLM, 
                    'SOFTWARE\Wow6432Node\MySQL AB\MySQL Connector/Net\', 
                    'Version', 
                    version); 
        Result := success and (CompareStr(version, '6.8.3') = 0);
    end;

function needsMySQLNET(): Boolean;
    begin
        Result := (isMySQLNETconnectorInstalled = False);
    end;
//--------------------------------------------------------------------------------
// MySQL ODBC Connector 5.3
//--------------------------------------------------------------------------------
function isMySQLODBCconnectorInstalled(): Boolean;
    var
        success: Boolean;
        version: String;
    begin
        success := RegQueryStringValue(HKLM, 
                        'SOFTWARE\MySQL AB\MySQL Connector/ODBC 5.3\', 
                        'Version', 
                        version); 
        Result := success and (CompareStr(version, '5.3.2') = 0);
    end;

function needsMySQLODBC(): boolean;
    begin
        Result := (isMySQLODBCconnectorInstalled = False);
    end;
//--------------------------------------------------------------------------------
// Sharepoint client components
//--------------------------------------------------------------------------------
function isSharepointClientInstalled(): Boolean;
    begin
        Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\SharePoint Client Components');
    end;

function needsSharePtClient(): Boolean;
    begin
        Result := (not isSharepointClientInstalled);
    end;
//--------------------------------------------------------------------------------
// Checks if the application is installed witht the old style installation 
//--------------------------------------------------------------------------------
function isOldStyleInstalled(): Boolean;
    var 
        success: Boolean;
        uninstall: String;
    begin
        success := RegQueryStringValue(HKCU, 
                        'Software\Microsoft\Windows\CurrentVersion\Uninstall\4f2a8fa50dcb64ac', 
                        'UninstallString', 
                        uninstall);
        Result := success and (Length(uninstall) > 0);
    end;
//--------------------------------------------------------------------------------
// Close application
//--------------------------------------------------------------------------------
const wbemFlagForwardOnly = $00000020;
procedure CloseApp(AppName: String);
    var
        WbemLocator  : Variant;
        WMIService   : Variant;
        WbemObjectSet: Variant;
        WbemObject   : Variant;
    begin;
        WbemLocator   := CreateOleObject('WbemScripting.SWbemLocator');
        WMIService    := WbemLocator.ConnectServer('localhost', 'root\CIMV2');
        WbemObjectSet := WMIService.ExecQuery('SELECT * FROM Win32_Process Where Name="' + AppName + '"');
        if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
            begin
                WbemObject := WbemObjectSet.ItemIndex(0);
                if not VarIsNull(WbemObject) then
                    begin
                        WbemObject.Terminate();
                        WbemObject := Unassigned;
                    end;
            end;
    end;

Это отлично работает без проблем при запуске как setup.exe, но при запуске как setup.msi он доходит до .dotNET Framework 4.5.1, а затем хочет дождаться завершения другой установки, чего я не вижу. В конечном итоге он завершится, но не установит какие-либо фреймворки или MSI.


person SPlatten    schedule 29.10.2014    source источник
comment
Нашел это: stackoverflow.com/ вопросы/16530866/   -  person SPlatten    schedule 29.10.2014
comment
К сожалению, это решение не работает, попытка запустить MSI с помощью: msiexec.exe /quiet /i netfx_Full_x64.msi не работает.   -  person SPlatten    schedule 29.10.2014


Ответы (1)


Оборачивать EXE-файл в MSI-файл — плохая практика, поскольку он создает так называемый «троянский» MSI-файл. Похоже, что это MSI, но он не имеет никаких преимуществ или согласованности MSI. Установка .NET Framework представляет собой EXE-файл, который вызывает несколько MSI/MSP внутри. Вы не можете обернуть MSI внутри MSI, потому что существует мьютекс системного уровня, который предотвращает это.

Я предлагаю вам взглянуть на что-то вроде установщиков InstallShield Suite или XML Burn установщика Windows, чтобы создать загрузчик для объединения этих пакетов.

person Christopher Painter    schedule 29.10.2014
comment
Я использую MS Visual Studio 2013, по какой-то причине фреймворк недоступен в виде MSI, и наш ИТ-отдел может развертывать MSI только с использованием групповой политики. - person SPlatten; 30.10.2014
comment
Возможности развертывания групповой политики очень ограничены. Ваш дизайн не исправит эту коробку. - person Christopher Painter; 30.10.2014
comment
Я поражен тем, что платформы .NET доступны только в виде установок .EXE, учитывая, что групповая политика может развертывать только MSI. - person SPlatten; 31.10.2014
comment
Учтите, что групповая политика была создана одним подразделением MSFT, а тот .NET framework другим. В то время установщик .NET был достаточно простым, чтобы его можно было развернуть через GPO. Затем они объединили все архитектуры платформ в единую инкапсуляцию EXE, и она больше не соответствовала модели GPO. Они, вероятно, не слишком беспокоились об этом, потому что именно поэтому они продают SCCM. Для экстремального способа развертывания .NET через GPO см.: blogs.msdn.com/b/astebner/archive/2010/06/04/10020299.aspx - person Christopher Painter; 31.10.2014
comment
Я продумываю ИТ-отдел. обнаружили, что они могут развернуть обновление .NET с помощью обновлений Windows ... Я также пытаюсь развернуть MSI x86 и x64, к сожалению, мне нужно определить тип системы, а затем выбрать MSI для развертывания. - person SPlatten; 31.10.2014