【问题标题】:Can I run a command before the setup.msi?我可以在 setup.msi 之前运行命令吗?
【发布时间】:2020-01-27 00:13:01
【问题描述】:

我有一个桌面应用程序,它的安装程序项目在Release 文件夹中生成两个文件:我们称它们为setup.exesetup.msi

在构建后事件中,我使用自签名证书签署setup.msi。那么我最终的安装批处理是由三个步骤组成的

  1. 使用start.cmd(或start.exe)添加用户存储证书
  2. 运行setup.exe。请注意,重要的是,它为具有我的姓名和姓氏的已验证作者显示了用户帐户控件。
  3. 出于安全原因/最佳实践,因为它是自签名的,所以在第 1 点删除(使用 stop.cmdstop.exe)证书

现在我对这个解决方案非常满意,我只想在setup.exe 中包含命令 1 和 3,前提是可以以标准方式。

我尝试做的是将start.exestop.exe 定义为自定义操作。在那种情况下,我只有setup.exesetup.msi 这两个文件,但不幸的是我得到了一个unkown 发布者。我想这显然是因为自定义操作进入.msi 而不是setup.exe。但我不是安装程序项目的专家,所以有人可能会提出更好的标准解决方案。

替代方法

我可以通过切换到 Inno Setup 更轻松地做到这一点吗?也许正如 comment 中所建议的那样?

参考文献

【问题讨论】:

    标签: visual-studio inno-setup setup-project user-account-control


    【解决方案1】:

    更新答案

    对不起,我已经在下面测试了我的原始答案,在某种意义上它是“错误的”:

    实际上我得到了一个单击安装程序,但是 Windows 操作系统在这种单击安装程序之前预期用户帐户控制,并且它显示一个未知的发布者,这违背了第 1 点(和第 3 点)的目的。

    所以,简短的更新答案:不可能 (*) 在标准的单击 exe 中执行此操作,就像下面提到的 SFX 模块生成的那样。

    (Note *):虽然它可以通过编译自定义 C# 代码并将文件添加到 Resources.resx,例如 _7zr.exe 等来实现......就像在这个例子中一样:

    using System.IO;
    using System.Diagnostics;
    namespace selfextractinstaller
    {
        class Program
        {
            static void Main(string[] args)
            {
                string file_path_7zr = @"_7zr.exe";
                using (FileStream fs = new FileStream(file_path_7zr, FileMode.Create))
                {
                    byte[] pgm_bytes = Properties.Resources._7zr;
                    fs.Write(pgm_bytes, 0, (int)pgm_bytes.Length);
                }
                string file_path_config = @"config.txt";
                using (StreamWriter sw = new StreamWriter(file_path_config, false))
                {
                    sw.Write(Properties.Resources.config);
                }
                string file_path_7zSD = @"_7zSD.sfx";
                using (FileStream fs = new FileStream(file_path_7zSD, FileMode.Create))
                {
                    byte[] pgm_bytes = Properties.Resources._7zSD;
                    fs.Write(pgm_bytes, 0, (int)pgm_bytes.Length);
                }
                Process.Start(file_path_7zr, "b");
            }
        }
    }
    

    类似的代码实际上可以用作自解压安装程序,它没有提升并且不需要UAC

    进一步阅读

    原答案

    在没有其他答案的情况下,我将继续使用SFX module for installers,将第 1-3 点的所有三个.exe(加上依次运行它们的install_all.bat)打包到一个自解压安装程序中,即将自动提取所有需要的文件(包括证书),最后运行install_all.bat

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 2014-05-10
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多