【问题标题】:WIX/MSI CopyFile doesn't work when running through SSH通过 SSH 运行时,WIX/MSI CopyFile 不起作用
【发布时间】:2018-08-17 11:41:38
【问题描述】:

我已经使用 WixTool 3.10 构建了一个简单的 MSI 文件。
其中一项功能是复制主机上已存在的文件。
当我通过远程桌面安装此 msi 时,一切正常。
但是,如果我通过 SSH 登录并运行此 MSI,则不会复制该文件。
这是我的 wxs 文件的简化版本:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="my product" Language="1033" Version="1.0" Manufacturer="Allen" 
           UpgradeCode="PUT-GUID-HERE">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
    <MediaTemplate EmbedCab="yes" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="My Folder">
        </Directory>
      </Directory>
    </Directory>

    <Property Id="FILEA">
      <DirectorySearch Id="SearchSourceDir" Path="[SOURCEDIR]">
          <FileSearch Name="fileA.txt" />
      </DirectorySearch>
    </Property>

    <Component Id="cmpCopyFile" Guid="*" Directory="INSTALLFOLDER">
      <CopyFile Id="CopyFileA" SourceProperty="FILEA" DestinationProperty="INSTALLFOLDER"/>
    </Component>

    <Feature Id="FeatureCopyFile" Title="Copy file" Level="1">
      <ComponentRef Id="cmpCopyFile" />
    </Feature>
  </Product>
</Wix>

这是我用于安装的命令:

msiexec /i test.msi /l*v install.log

在日志中,我可以看到功能和组件已安装,但是文件没有被复制。
这是预期的行为吗?感谢您提供任何帮助或建议。

更新: 这是本地安装和远程安装的日志 install_local.log install_remote.log

【问题讨论】:

  • 显而易见的问题是这个文件中有什么,如果它可以通过其他更可靠的机制安装 - 例如它是 XML 或 INI 文件。
  • @SteinÅsmul 这是一个纯文本配置文件,将与 msi 安装程序一起以 zip 文件的形式提供。
  • 在下面添加了一些 cmets 和建议。我不熟悉为此目的使用 SSH。我不确定它是如何运作的。
  • 我尝试修改聊天室权限让你进入,但还是不行。

标签: wix windows-installer wix3.10


【解决方案1】:

SecureCustomProperties: 远程安装是静默的,而客户端是交互式的?这可能会影响APPSEARCH 属性在延迟/静默模式下的可用性。

您需要将属性标记为安全,以便它们从 客户端- (GUI) 传递到 服务器 进程(安装)。您能否尝试在您的 WiX 源代码中更改它并重新编译:

当前

<Property Id="FILEA">

更新

<Property Id="FILEA" Secure="yes">

然后重新编译并测试安装。


或者,您可以修改或“修复”当前 MSI 文件中的 SecureCustomProperties 属性以包含 FILEA。这涉及到在 SecureCustomProperties 的当前值前面加上 FILEA 的前缀:

FILEA;NETFRAMEWORK20;WIX_DOWNGRADE_DETECTED;WIX_UPGRADE_DETECTED

如果您从 WiX 源重新编译 MSI,这将为您完成 - 显然。添加这个以防源无法使用指定的 Secured 属性进行编译。


除此之外,这在本地日志文件中看起来很奇怪:

PROPERTY CHANGE: Adding FILEA property. Its value is 'C:\Users\tetter\fileA.txt\'.

但是让我们看看上面是否解决了问题。


避免文件复制?:什么 SSH 客户端?从未尝试通过 SSH 部署 MSI。不是 100% 匹配,而是 maybe read my answer on the issue of config files and settings management。通过更强大的方式安装文件很可能会更可靠 - 正如您从当前问题中可以清楚地看到的那样。例如通过使用 IniFile 表或使用 WiX 的 XML 写入功能。

应用程序下载:说实话,为什么不直接从您的应用程序从数据库或 UNC 路径下载这些设置呢?应该为您节省任何部署问题,并且您具有更好的调试能力(在测试计算机上实时调试,没有“一次性”部署问题,调试能力有限),并且您可以确保所有客户端都有最新的提供他们可以访问 UNC 路径的设置?只是一个想法。

原因:如果我要对原因进行推理,我会说您的 MSI 通过远程桌面在您的管理上下文中运行,并可以访问您的登录上下文和访问令牌并因此拥有该份额的权利。当您从 SSH 启动 MSI 时,它可能会在系统上下文中运行,根本没有网络访问权限 - 或者非常有限。只是猜测。

【讨论】:

  • 使用 SSH 的原因是为了适应我目前的测试基础。其中主要包含 Linux 机器。我已经在目标 Windows 机器上设置了一个 bitvise ssh 服务器。
  • 听起来我有很多关于 Linux / Windows 互换性挑战的问题。我将不得不等待你的博客:-)。再次阅读以上内容,我认为它不会对您有太大帮助。奇怪的是文件没有被复制并且 MSI 完成。您是否在驱动器中搜索了相关文件?也许它最终在其他地方结束了?也许先检查 C:\ 的根目录和系统文件夹? Some tips for interpreting MSI log files.
  • 我刚刚测试了一遍,文件没有复制到其他文件夹。我可以看到两个安装日志之间存在很大差异,但是不能真正说出这个问题的根本原因是什么。如果您能看看我刚刚上传的日志,我将不胜感激。
  • 您是否在 VirtualBox / Wine 或类似的设备上运行?看起来目录解析在您标记为本地安装的内容中非常混乱(也许您将日志混淆了?)。恐怕我从来没有见过这样的事情。不太确定发生了什么。示例:SHELL32SHGetFolderPath returned CUserstetterAppDataRoaming。缺少目录分隔符或斜杠。
  • 是的,这是在 VMware ESXi 上运行的虚拟机,但是我可以毫无问题地看到斜线。 SHELL32::SHGetFolderPath returned: C:\Users\tetter\AppData\Roaming。也许我应该把日志放在别的地方?
【解决方案2】:

如果为区分大小写的源属性使用正确的名称(SourceDir)可能会有所不同

https://msdn.microsoft.com/en-us/library/windows/desktop/aa371857(v=vs.85).aspx

【讨论】:

  • 我已将 DirectorySearch 路径修改为 SourceDir,但仍然有同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 2010-12-20
  • 2016-10-04
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多