2013-12-04 2 views
16

У меня есть проект, для которого я создал файл Wii Wii. У меня также есть загрузочный файл WiX (exe-файл), который проверяет наличие C++ 2005, устанавливает его, если не найден, а затем устанавливает пакет msi. Мой проект включает Crystal Reports в виде файла msm, который устанавливается с помощью msi, но для корректной установки требуется C++ 2005.WiX: Digitally Sign BootStrapper project

В проекте MSI я включил следующее сообщение после сборки для цифровой подписи файла msi.

sign /f "$(ProjectDir)\myPFXFile.pfx" /p mySecretKey/d "My Program" /t http://timestamp.verisign.com/scripts/timstamp.dll /v "MyProgram.msi" 

Если я устанавливаю только msi, он правильно идентифицирует издателя при запросе повышенного разрешения на установку.

Я попытался добавить такое же событие, после сборки в проект загрузчика следующим образом:

sign /f "$(ProjectDir)\myPFXFile.pfx" /p mySecretKey/d "My Program" /t http://timestamp.verisign.com/scripts/timstamp.dll /v "MyProgram Setup.exe" 

При попытке установить EXE файл, он правильно определяет издатель, но затем не удается установить с вытекающей из файл журнала:

[1604:2574][2013-12-04T11:49:51]i001: Burn v3.7.1224.0, Windows v6.2 (Build 9200: Service Pack 0), path: C:\Users\.....\MyProgram Setup.exe, cmdline: '' 
[1604:2574][2013-12-04T11:49:51]i000: Setting string variable 'WixBundleLog' to value 'C:\Users\.....\MyProgram_20131204114951.log' 
[1604:2574][2013-12-04T11:49:51]i000: Setting string variable 'WixBundleOriginalSource' to value 'C:\Users\.....\MyProgram Setup.exe' 
[1604:2574][2013-12-04T11:49:51]i000: Setting string variable 'WixBundleName' to value 'MyProgram' 
[1604:2574][2013-12-04T11:49:51]i100: Detect begin, 2 packages 
[1604:2574][2013-12-04T11:49:51]i000: Setting string variable 'vcredist_x86' to value '1' 
[1604:2574][2013-12-04T11:49:51]i000: Setting string variable 'vcredist_x64' to value '1' 
[1604:2574][2013-12-04T11:49:51]i052: Condition 'vcredist_x86 AND (vcredist_x86 >= 1)' evaluates to true. 
[1604:2574][2013-12-04T11:49:51]i101: Detected package: vcredist_x86, state: Present, cached: None 
[1604:2574][2013-12-04T11:49:51]i101: Detected package: MyProgram, state: Absent, cached: None 
[1604:2574][2013-12-04T11:49:51]i199: Detect complete, result: 0x0 
[1604:2574][2013-12-04T11:49:53]i200: Plan begin, 2 packages, action: Install 
[1604:2574][2013-12-04T11:49:53]w321: Skipping dependency registration on package with no dependency providers: vcredist_x86 
[1604:2574][2013-12-04T11:49:53]i000: Setting string variable 'WixBundleRollbackLog_MyProgram' to value 'C:\Users\.....\MyProgram_20131204114951_0_MyProgram_rollback.log' 
[1604:2574][2013-12-04T11:49:53]i000: Setting string variable 'WixBundleLog_MyProgram' to value 'C:\Users\.....\MyProgram_20131204114951_0_MyProgram.log' 
[1604:2574][2013-12-04T11:49:53]i201: Planned package: vcredist_x86, state: Present, default requested: Present, ba requested: Present, execute: None, rollback: None, cache: No, uncache: No, dependency: None 
[1604:2574][2013-12-04T11:49:53]i201: Planned package: MyProgram, state: Absent, default requested: Present, ba requested: Present, execute: Install, rollback: Uninstall, cache: Yes, uncache: No, dependency: Register 
[1604:2574][2013-12-04T11:49:53]i299: Plan complete, result: 0x0 
[1604:2574][2013-12-04T11:49:53]i300: Apply begin 
[1FF8:10F8][2013-12-04T11:49:58]i360: Creating a system restore point. 
[1FF8:10F8][2013-12-04T11:49:59]i361: Created a system restore point. 
[1FF8:10F8][2013-12-04T11:50:00]i000: Caching bundle from: 'C:\Users\.....\{6ab8eece-89c6-4417-905f-6d9c5136519d}\.be\MyProgram Setup.exe' to: 'C:\ProgramData\Package Cache\{6ab8eece-89c6-4417-905f-6d9c5136519d}\MyProgram Setup.exe' 
[1FF8:10F8][2013-12-04T11:50:00]i320: Registering bundle dependency provider: {6ab8eece-89c6-4417-905f-6d9c5136519d}, version: 2.0.0.0 
[1604:2FB4][2013-12-04T11:50:00]i336: Acquiring container: WixAttachedContainer, copy from: C:\Users\.....\MyProgram Setup.exe 
[1604:2FB4][2013-12-04T11:50:00]i000: Setting string variable 'WixBundleLastUsedSource' to value 'C:\Users\.....' 
[1604:24F8][2013-12-04T11:50:00]e000: Error 0x80004005: Failed to extract all files from container. 
[1604:2FB4][2013-12-04T11:50:00]e000: Error 0x80004005: Failed to wait for operation complete. 
[1604:2FB4][2013-12-04T11:50:00]e000: Error 0x80004005: Failed to open container. 
[1604:2FB4][2013-12-04T11:50:00]e000: Error 0x80004005: Failed to open container: WixAttachedContainer. 
[1604:2FB4][2013-12-04T11:50:00]e312: Failed to extract payloads from container: WixAttachedContainer to working path: C:\Users\.....\{6ab8eece-89c6-4417-905f-6d9c5136519d}\C7C1FB4E513C19E0F5E8F6856FF2ACC4D7D143A2, error: 0x80004005. 
[1604:2574][2013-12-04T11:50:00]e000: Error 0x80004005: Failed while caching, aborting execution. 
[1FF8:10F8][2013-12-04T11:50:00]i330: Removed bundle dependency provider: {6ab8eece-89c6-4417-905f-6d9c5136519d} 
[1FF8:10F8][2013-12-04T11:50:00]i352: Removing cached bundle: {6ab8eece-89c6-4417-905f-6d9c5136519d}, from path: C:\ProgramData\Package Cache\{6ab8eece-89c6-4417-905f-6d9c5136519d}\ 
[1604:2574][2013-12-04T11:50:00]i399: Apply complete, result: 0x80004005, restart: None, ba requested restart: No 

Я тогда нашел другую альтернативу подписания ехе, добавив следующую строку в конец файла .wixproj:

<Target Name="SignBundleEngine"> 
    <Exec Command="&quot;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe&quot; sign /f &quot;$(ProjectDir)\sigFile.pfx&quot; /p sigKey /d &quot;My Program&quot; /t http://timestamp.verisign.com/scripts/timstamp.dll &quot;@(SignBundleEngine)&quot;" /> 
    </Target> 
    <Target Name="SignBundle"> 
    <Exec Command="&quot;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe&quot; sign /f &quot;$(ProjectDir)\sigFile.pfx&quot; /p sigKey /d &quot;My Program&quot; /t http://timestamp.verisign.com/scripts/timstamp.dll &quot;@(SignBundle)&quot;" /> 
    </Target> 
    <PropertyGroup> 
    <PostBuildEvent>"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f "$(ProjectDir)\sigFile.pfx" /p sigKey /d "My Program" /t http://timestamp.verisign.com/scripts/timstamp.dll /v "MyProgram Setup.exe"</PostBuildEvent> 
    </PropertyGroup> 

Используя этот метод, файл установки выполняет и устанавливает все правильно, но не идентифицирует издателя при запросе повышенного разрешения на установку, он говорит «Издатель: Неизвестно».

Кто-нибудь знает, как получить цифровое подписание для работы над этим загрузчиком?

Вот мой Bundle.wxs и vcredist.wxs файлы:

Bundle.wxs

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
    xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"> 


    <Bundle Name="My Program" 
      Version="2.0.0" 
      Manufacturer="My Company" 
      UpgradeCode="PUT-GUID-HERE" 
      HelpUrl="http://www.mycompany.com" 
      AboutUrl="http://www.mycompany.com" 
      HelpTelephone="888 888 8888" 
      IconSourceFile="Resources\program.ico"> 

    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense"> 
     <Payload SourceFile="Resources\Bootstrapper Screen.png" /> 
    </BootstrapperApplicationRef> 

    <WixVariable Id="WixStdbaLicenseUrl" Value=""/> 

    <WixVariable Id="WixStdbaThemeXml" Value="Resources\CustomHyperlinkTheme.xml"/> 
    <WixVariable Id="WixStdbaThemeWxl" Value="Resources\CustomHyperlinkTheme.wxl"/> 

    <Chain> 

     <!-- Define the list of chained packages. --> 
     <PackageGroupRef Id="vcredist"/> 
     <MsiPackage Id="MyProgram" 
        SourceFile="$(var.MyProgramSetup.TargetPath)" 
        ForcePerMachine="yes" /> 
    </Chain> 
    </Bundle> 
</Wix> 

vcredist.wxs

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> 
    <Fragment> 
    <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86" Value="Installed" Variable="vcredist_x86" /> 
    <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x64" Value="Installed" Variable="vcredist_x64" /> 
    <PackageGroup Id="vcredist"> 
     <ExePackage Id="vcredist_x86" 
     Cache="no" 
     Compressed="yes" 
     PerMachine="yes" 
     Permanent="yes" 
     Vital="yes" 
     Name="vcredist_x86.exe" 
     SourceFile="vcredist3.5_x86.exe" 
     InstallCommand="/q" 
     DetectCondition="vcredist_x86 AND (vcredist_x86 &gt;= 1)"> 
     </ExePackage> 
    </PackageGroup> 
    </Fragment> 
</Wix> 
+0

Как ваши события создания сообщений знают, как подписать файл без ссылки на файл signtool.exe? Здесь что-то не хватает? – karfus

ответ

19
<Target Name="UsesFrameworkSdk"> 
    <GetFrameworkSdkPath> 
     <Output TaskParameter="Path" PropertyName="FrameworkSdkPath" /> 
    </GetFrameworkSdkPath> 
    <PropertyGroup> 
     <Win8SDK>$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\[email protected])</Win8SDK> 
    </PropertyGroup>  
    </Target> 

    <Target Name="UsesSignTool" DependsOnTargets="UsesFrameworkSdk"> 
    <PropertyGroup> 
     <SignToolPath Condition="('@(SignToolPath)'=='') and Exists('$(FrameworkSdkPath)bin\signtool.exe')">$(FrameworkSdkPath)bin\signtool.exe</SignToolPath> 
     <SignToolPath Condition="('@(SignToolPath)'=='') and Exists('$(Win8SDK)\bin\x86\signtool.exe')">$(Win8SDK)\bin\x86\signtool.exe</SignToolPath> 
    </PropertyGroup> 
    </Target> 

    <Target Name="SignBundleEngine" DependsOnTargets="UsesSignTool"> 
    <Exec Command="&quot;$(SignToolPath)&quot; sign /d &quot;App Setup&quot; /t http://timestamp.digicert.com /a &quot;@(SignBundleEngine)&quot;" /> 
    </Target> 

    <Target Name="SignBundle" DependsOnTargets="UsesSignTool"> 
    <Exec Command="&quot;$(SignToolPath)&quot; sign /d &quot;App Setup&quot; /t http://timestamp.digicert.com /a &quot;@(SignBundle)&quot;" /> 
    </Target> 

Это хорошо работает для меня. Либо вы делаете это во время сборки, либо вам нужно использовать знаки различия.
Ex: ответ http://wixtoolset.org/documentation/manual/v3/overview/insignia.html

insignia -ib bundle.exe -o engine.exe 
... sign engine.exe 
insignia -ab engine.exe bundle.exe -o bundle.exe 
... sign bundle.exe 
+0

Я попробовал то, что у вас было выше, с одним незначительным модом, чтобы разместить мою среду: укажите на ... Windows \ v7.1A, поскольку у меня нет ... \ v8.0 на моей машине и v7.1.A. где находится файл signtool.exe. Я получаю подобное сообщение об ошибке, как и раньше: «Команда« "/« Установка приложения »/ t http://timestamp.digicert.com/a« obj \ Debug \ MyProgram.exe »« вышла с кодом 9009. ». Я запускаю Windows 8.1, возможно, мне нужна более новая версия signtool? – BrianKE

+0

У вас возникли проблемы с поиском установленного SDK. Вам нужно либо настроить целевую программу UsesFrameworkSDK для поиска, чтобы найти ваш, либо, возможно, жестко закодировать путь (yuck). – jchoover

+0

Я жестко закодировал в C: \ Program Files (x86) \ Microsoft SDK \ Windows \ v7.1A \ Bin \ signtool.exe, и теперь проект строится, EXE имеет цифровую подпись и устанавливается правильно.Единственная проблема, связанная с ворчанием, заключается в том, что во время установки при запросе на повышенное разрешение приглашение показывает Publisher как «Неизвестно», а не показывает мое название компании. Любая идея, как это исправить? – BrianKE

4

Дальнейшие @ jchoover, вы есть 3 варианта при подписании связки:

  • Построить пучок без знака, а затем подписать его позже. Однако вам также нужно подписать двигатель exe, который встроен в комплект. Поскольку состояния @jchoover, вы можете использовать знаки отличия, чтобы обойти это, извлекая движок в файл. Затем вы можете подписать файл, используя обычный процесс (например, с помощью signtool.exe), а затем импортировать его обратно в комплект

  • Добавьте целевые объекты SignBundle и SignBundleEngine в свои проекты. Вы можете сделать это, открыв их в текстовом редакторе и отредактировав базовый код MSBuild. Ответ @ jchoover описывает, как вы можете это сделать.

  • Создать .targets файл с целями SignBundle и SignBundleEngine, и пройти этот путь, используя свойство CustomAfterWixTargets:

    msbuild your.sln /p:CustomAfterWixTargets=customafterwix.targets /p:SignOutput=true

7

Для меня, используя встроенный в инструмент WIX в insignia является наиболее прямо вперед. Вот шаги, которые я сделал, чтобы сделать кодовое знаком установщик WiX MSI и bootstrap:
(шаги 1 & 2 только что настроены, чтобы сделать 3 & 4 читать легко и многократно многократно и обновляемо! Шаги 3 & 4 являются фактическим подписанием)

  1. Настройте signtool как пакетный файл в моем PATH, чтобы я мог его вызвать и легко изменить. Я бег Windows 10 и поэтому мой «signtool.bat» выглядит следующим образом:
    "c:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe" %*
  2. Настройка insignia как пакетный файл в моих PATH тоже, так что вы можете изменить его с новым WiX строит, как они приходят. Мой "insignia.bat" выглядит следующим образом:
    "C:\Program Files (x86)\WiX Toolset v3.10\bin\insignia.exe" %*
  3. подписывает MSI в случае после сборки (MSI Project -> Свойства -> Build Events) по телефону это:
    signtool sign /f "c:\certificates\mycert.pfx" /p cert-password /d "Your Installer Label" /t http://timestamp.verisign.com/scripts/timstamp.dll /v $(TargetFileName)
  4. Вход узелок в случае после сборки для начальной загрузки проекта, как это:

    CALL insignia -ib "$(TargetFileName)" -o engine.exe
    CALL signtool sign /f "c:\certificates\mycert.pfx" /p cert-password /d "Installer Name" /t http://timestamp.verisign.com/scripts/timstamp.dll /v engine.exe
    CALL insignia -ab engine.exe "$(TargetFileName)" -o "$(TargetFileName)"
    CALL signtool sign /f "c:\certificates\mycert.pfx" /p cert-password /d "Installer Name" /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(TargetFileName)"


Дальнейшие заметки и мысли:

  • Я также подписал заявление (я думаю), просто делая Project Properties -> Signing и позволяет нажать однократно проявляется, выбирая сертификат и проверки опции Sign the assembly.

  • Задание CALL необходимо в событиях после сборки при вызове командного файла или вызывается только первый.

+0

Если вы получаете эту ошибку при попытке подписать файл engine.exe:' SignedCode :: Sign возвратил ошибку: 0x800700C1', убедитесь, что ваш $ (TargetFileName) не подписан первым. –

Смежные вопросы