Mage.exe 部署问题
我有一个需要在每个服务器上进行更改的配置文件,以便一旦服务器上安装了我们的软件,客户端安装程序的配置文件就会设置为匹配该服务器的特定设置,然后复制到公共Web 上的文件夹用于部署。
由于我要更改配置文件,因此我还必须重建 *.manifest 和 *.application 文件,据我了解,我唯一真正的选择是使用 Win7 SDK 中的 Mage.exe。为了使用修改后的配置文件中的正确哈希值修复 *.manifest 文件,我运行:
mage -new Application -fd ".\Application Files\_1_0_0_0" -ToFile ".\Application Files\_1_0_0_0\ .exe.manifest" -Name " " -版本“1.0.0.0”-CertFile“key.pfx”-密码“<密码>”
然后,为了使用修改后的 *.manifest 文件中的正确哈希来修复 *.application 文件,我运行:
mage -new Deployment -I t -t ".application" -v "1.0.0.0" - appManifest ".\Application Files\ _1_0_0_0\ .exe.manifest" -pu "http://<主机地址>/<路径>/Application Files/ _1_0_0_0/< appName>.exe.manifest" -CertFile "key.pfx" -password ""
现在,这一切都有效,我收到文件已成功签名的消息。但是,当我尝试安装客户端应用程序时,当我收到带有以下消息的错误日志时,很明显出现了问题:
+ Deployment manifest is not semantically valid.
+ Deployment manifest requires <deployment> section.
在查看 *.application 文件时,它在“部署”节点下有一些附加信息,该节点直接来自 VS2008 的发布功能的相同文件没有:
<deployment install="true">
<subscription>
<update>
<expiration maximumAge="0" unit="days" />
</update>
</subscription>
<deploymentProvider codebase="http://<hostaddress>/<path>/Application Files/<appName>_1_0_0_0/<appName>.exe.manifest" />
</deployment>
VS2008 发布版本只有:
<deployment install="true" />
当我删除附加信息并将部署节点设置为自终止节点,然后重新签名文件时,一切都会按预期进行。
这是一个已知问题吗?是否有任何方法可以让 Mage 在部署节点中无需额外信息即可创建文件,以便其正常工作?
编辑:作为临时解决方案,我将文件加载到 XmlDocument 中并修改它们以适应,然后重新签名文件。此外,我现在面临的问题是尚无法确定如何向部署添加图标,因此“开始”菜单项获得的图标不是通用图标。
I have a config file that needs changed on a per-server basis, so that once a server has our software installed on it, the config file for a client installer is set up to match that server's particular settings, and then copied to a public folder on the web for deployment.
Since I'm changing the config file, I also have to rebuild the *.manifest and *.application files, and as I understand it, my only real option for this is to use Mage.exe from the Win7 SDK. In order to fix the *.manifest file with the proper hash from the modified config file, I run:
mage -new Application -fd ".\Application Files\<appName>_1_0_0_0" -ToFile ".\Application Files\_1_0_0_0\<appName>.exe.manifest" -Name "<appName>" -Version "1.0.0.0" -CertFile "key.pfx" -password "<password>"
and then, to fix the *.application file with the proper hash from the modified *.manifest file, I run:
mage -new Deployment -I t -t "<appName>.application" -v "1.0.0.0" -appManifest ".\Application Files\<appName>_1_0_0_0\<appName>.exe.manifest" -pu "http://<hostaddress>/<path>/Application Files/<appName>_1_0_0_0/<appName>.exe.manifest" -CertFile "key.pfx" -password ""
Now, this all works, and I get the message that the files were successfully signed. When I try to install the client app though, it's obvious that something has gone awry when I get an error log with the message:
+ Deployment manifest is not semantically valid.
+ Deployment manifest requires <deployment> section.
In looking at the *.application file, it has some additional information under the "deployment" node, which the same file directly from the publish feature of VS2008 does not have:
<deployment install="true">
<subscription>
<update>
<expiration maximumAge="0" unit="days" />
</update>
</subscription>
<deploymentProvider codebase="http://<hostaddress>/<path>/Application Files/<appName>_1_0_0_0/<appName>.exe.manifest" />
</deployment>
The VS2008 publish version simply has:
<deployment install="true" />
When I remove the additional information and set the deployment node to a self terminating node, then re-sign the file, everything works as expected.
Is this a known issue and is there any way to get Mage to create the file without the extra information in the deployment node so that it will work properly?
EDIT: As a temporary solution, I am loading the files into an XmlDocument and modifying them to suit, then re-signing the files. Additionally, I'm now facing the issue of being as yet unable to determine how to add an icon to the deployment, so the Start menu item gets an icon other than the generic icon.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是我的实现。我在这一点代码上花了很多时间,但我仍然没有找到所有正确的选项,让 Mage 在无需干预的情况下处理所有 .application 文件的生成。我想说的是,可能可以对这段代码进行很多优化。然而,这仍然可以用作帮助某人的跳板。
为了使以下方法起作用,您必须从 VS 中的 ClickOnce 至少部署一次,然后只保留该部署中的 .application 文件。您必须删除部署文件夹中的 .application 和 .manifest。
将所有应用程序文件移至
Config.Instance.ServerSettings.ClientLocation + "_"
后:Here is my implementation. I've spent a lot of time on this little bit of code, and I still haven't found all the right options to have Mage handle all of the generation of the .application file without intervention. I'm going to say there are probably a lot of optimizations that could be made to this code. However, this can still be used as a springboard to help someone.
In order for the following method to work, you have to deploy it at least once from ClickOnce in VS, and then just keep the .application file from that deployment. You MUST delete the .application and .manifest IN the deploy folder.
After I've moved all the application files to
Config.Instance.ServerSettings.ClientLocation + "<AppName>_<version>"
:如果您的目标是在环境之间修改应用程序清单,我不确定您为什么要创建一个新的清单。只需修改您当前的即可。我发布了一个 powershell 脚本,它可以满足您的需要以及更多...在我的例子中,我有一个设置引导程序,但您需要的相关代码位于底部。
对于安装引导程序,您无法重新签署已签名的引导程序,因此我必须找到第三方 dll 来取消签名。 (delcert) http://forum.xda-developers.com/showthread.php? t=416175 我把那个母亲放在源代码管理中,以防有一天它从网络上消失:)
找到
#Begin Resigning各种Manifests
部分If your goal is to modify your application manifest between environments I'm not sure why you're creating a new one. Just modify your current one. I am posting a powershell script that does what you need and more... In my case I have a setup bootstrapper, but the relevant code you need is towards the bottom.
For the setup bootstrapper you can't resign a signed bootstrapper so I had to find a third party dll to unsign it. (delcert) http://forum.xda-developers.com/showthread.php?t=416175 I have that mother in source control in case it disappears from the web one day :)
Find the section
#Begin Resigning various Manifests