我们的许多客户可访问的InstallShield,明智的或AdminStudio.这些都不是一个问题。我希望有某种方式我可以提供我们的小客户 没有获得商业重新包装的工具 一个免费提供的一套工具和步骤的文件代替自己。

只需要换一个单一的结构文件内的一个压缩MSI,目标用户可以被假定为已经有逆戟鲸安装,知道如何使用这个定制的财产表(嵌入许可证的详细信息,GPO署),并已产生一个MST文件。



免责声明: 这是非常相似 另一个问题 但这两个问题和答案在于线不明确。

有帮助吗?

解决方案

好吧,重新审视我自己的答案提供了很好的小VB脚本,将尽一切繁重这个问题。正如原来的问题提到的,目的是提供一个简单的解决方案,系统管理员用户,以使更新/改变自己。

下面是我目前提供给客户的代码的简化版本

Option Explicit

Const MY_CONFIG = "MyConfigApp.xml"
Const CAB_FILE = "config.cab"
Const MSI = "MyApp.msi"

Dim filesys : Set filesys=CreateObject("Scripting.FileSystemObject")

If filesys.FileExists("temp.tmp") Then filesys.DeleteFile("temp.tmp")
filesys.CopyFile MSI, "temp.tmp"

Dim installer, database, database2, view
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase ("temp.tmp", 1)
Set database2 = installer.OpenDatabase (MSI, 1)

If Not filesys.FileExists(MY_CONFIG) Then WScript.Quit 2 ' No config file, abort!

Dim objFile, size, result, seq, objCab

' MakeCab object has been depreciated so we fallback to makecab.exe for with Windows 7
On Error Resume Next ' Disable error handling, for a moment
Set objCab = CreateObject("MakeCab.MakeCab.1") 
On Error Goto 0  ' Turn error handling back on

If IsObject(objCab) Then ' Object creation successful - use XP method   
    objCab.CreateCab CAB_FILE, False, False, False
    objCab.AddFile MY_CONFIG, filesys.GetFileName(MY_CONFIG)
    objCab.CloseCab
    Set objCab = Nothing
Else ' object creation failed - try Windows 7 method
    Dim WshShell, oExec
    Set WshShell = CreateObject("WScript.Shell")
    Set oExec = WshShell.Exec("makecab " & filesys.GetFileName(MY_CONFIG) & " " & CAB_FILE)
End If

Set objFile = filesys.GetFile(MY_CONFIG)
size = objFile.Size

Set view = database.OpenView ("SELECT LastSequence FROM Media WHERE DiskId = 1")
view.Execute
Set result = view.Fetch
seq = result.StringData(1) + 1 ' Sequence for new configuration file

Set view = database.OpenView ("INSERT INTO Media (DiskId, LastSequence, Cabinet) VALUES ('2', '" & seq & "', '" & CAB_FILE & "')")
view.Execute

Set view = database.OpenView ("UPDATE File SET FileSize = " & size & ", Sequence = " & seq & ", FileName = 'MYC~2.CNF|MyConfigApp.xml' WHERE File = '" & MY_CONFIG & "'")
view.Execute

database.GenerateTransform database2, "CustomConfig.mst"
database.CreateTransformSummaryInfo database2, "CustomConfig.mst", 0, 0
filesys.DeleteFile("temp.tmp")

Set view = nothing
Set installer = nothing
Set database = nothing
Set database2 = nothing
Set filesys = Nothing
WScript.Quit 0

更新: MakeCab.MakeCab.1 的对象现在已经贬值,代码更新,现在使用Windows 7中运行

其他提示

我asume您创建MSI文件自己(?)

当您使用维克斯产生微星,客户更换后只需重新生成整个MSI文件(WiX的是免费的)。否则,它可能使用未嵌入微星未压缩的文件。在威克斯你必须添加一个媒体元素没有一个内阁属性。缺点是,你必须分发而不是单个MSI两个文件,

IMHO这种场景的表示被安装在所述应用程序的缺失的特征,并且更易于在应用程序以固定比用MSI周围黑客。


管理图像

让我先说一个简单的方法来“解决”这对你的用户,就是要告诉他们运行MSI的安装管理。这将基本上是提取从内部CAB的所有文件,并把所有的文件中指定的文件夹:

<强> MSIEXEC.EXE /一个myinstaller.msi TARGETDIR = C:\ AdminImage

您的用户可以再直接进入提取的文件夹结构,更新有问题的文件,然后映射目录其他电脑并安装MSI。可能有副作用这与具有在MSI(以避免欺骗)的散列值的文件,但在大多数情况下,它工作得很好。


运行XML XPath查询

的部署工具,如InstallShield和维克斯功能新版的内置支持,在安装过程中运行XPath查询,从而动态地写部分。


应用更新

设置在PC上的应用程序包括几个步骤。首先是内容的机器部署 - 这应该使用MSI,这是毫无疑问来完成。然而,在最先进的应用几个“安装后的配置任务”类似这样的“配置文件更新”是必需的。

这是几乎总是更好地推迟这些配置任务,直到在启动应用程序,而不是落实在MSI功能。有许多原因,但只有应用程序EXE将保证最重要的是在正确的用户上下文中运行。 MSI文件可与系统的权利,不同的用户帐户或通过某些其它机制来运行。

我们一般建议是使用MSI为获得所有所需的内容到PC 。然后标记注册表来指示,它是第一个推出(更新时,您可以增加一个计数器或写入新的版本号HKLM)中的应用。然后应用程序可以执行其启动程序的最终配置步骤。它可以从什么地方到%ProgramFiles%复制一个默认的config.xml文件并将其复制到用户配置文件。然后,它可以读取HKLM由MSI写入所需的值,然后更新与这些值config.xml文件中。

在一般:避免MSI或任何其他的设置机构执行配置步骤。专注于所需的文件和注册表项写入机器,然后让应用程序本身设置正确的运行时环境。这将允许更好的部署控制。这是更好地“封装”如果你喜欢。的MSI通过注册表发送“消息”到应用程序,并且应用程序知道基于该消息“如何本身正确设置”。

您需要一个条目添加到媒体表,增加无压缩文件的另一个介质和LastSequence比CAB文件的最后一个序列多一个。然后,您需要在文件表更换该文件的新文件序列,并更新所有可能已经改变了的其它文件属性。

检查下列柱: 如何在MSI安装程序替换文件?

其中是mentionned:

此命令提取MSI文件: msi2xml -c OutputDir TestMSI.MSI

打开OutputDir并修改该文件。

要重建MSI运行: xml2msi.exe -m TestMSI.xml

您需要-m忽略“MD5校验和测试”时的MSI文件(多个)修改的失败。

下载: https://msi2xml.sourceforge.io/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top