我创建了WiX installer项目,用于在客户计算机上部署我的.net winform应用程序。该应用程序只扫描文档并将图像保存到服务器上的数据库中。扫描仪是相当具体的,在公司中只有一个,但大约有。可以偶尔使用它的=>应用程序的四个用户将被安装在一个专门用于扫描的单一工作站上-大多数时间它将是免费的,并且这些用户中的任何一个都可以来,扫描文档并继续他的工作。
ALLUSERS我正在进行单机安装:=>硬编码为1。
因为生产中的数据库服务器不受我的控制,而且我也不知道数据库将存储在哪里,所以我无法将正确的ConnectionStrings.config文件打包到MSI存档中。相反,安装程序会根据用户在安装过程中提供的参数值修改此配置。为了更新连接字符串,我使用了util:XmlFile元素。connectionstrings.config文件与应用程序二进制文件一起存储在安装目录中。
一切看起来都很好,直到我模拟了两个用户使用这种每台机器的安装。我已经在我自己的帐户下执行了我的wix安装项目,XML配置文件已经正确更新,然后我启动了应用程序并测试了连接字符串是否正常。一切都很好。
然后我切换到另一个用户帐户。快捷方式已经出现在程序菜单中-正如我所预期的那样,因为安装是按机器进行的。所以我点击了快捷键,然后(对我来说出乎意料的)出现了一个进度条窗口“等待产品XY的配置完成”。出现了。(请注意,我的机器区域设置不是英语,在英语区域设置工作站上消息可能会略有不同)。几秒钟后,窗口消失,我的应用程序启动。不幸的是,它无法连接到数据库,因为connectionStrings.config文件已被重写-连接字符串已使用默认(=不正确)属性值更新。
我一直在调查为什么每当新的用户帐户尝试使用它时,安装程序都会再次启动。这是因为快捷方式元素(快捷方式被放在'ProgramMenuFolder‘中。有一个卸载操作的请求,其中AFAIK需要一个父组件,而这个组件需要一个KeyPath,它必须是HKCU下的注册表项。)当我从WXS中删除所有的Program-Menu-Shortcut-stuff时,MSI在切换用户上下文后不会再次启动。
结果是我有了设置程序,它能够根据输入参数配置到数据库的连接。但是,以后试图从第二个用户帐户使用该应用程序时,只会将此配置发送到洗手间。在生产环境中,这意味着管理员必须在每次新用户尝试使用该应用程序时手动更改连接字符串,这当然是不可接受的行为。
这是我的WiX源代码的简化版本:
<?define ProductID = "11111111-1111-1111-1111-111111111111" ?>
<?define ProductName = "MyProduct" ?>
<?define ProductLocalName = "MyLocalLanguageProductName" ?>
<!-- application's root registry path, where it stores its settings -->
<?define ApplicationRootRegistryKey = "Software\MyCompany\MyProject\MyBuildConfiguration" ?>
<Product Id="$(var.ProductID)" UpgradeCode="{11111111-1111-1111-1111-111111111112}"
Name="$(var.ProductName)" Version="1.10.1103"
Manufacturer="MyCompany"Language="1029" Codepage="1250">
<Package Id="*" InstallerVersion="200" Compressed="yes"
Description="$(var.ProductName) Installer" Languages="1029"
SummaryCodepage="1250" />
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<!-- always install the app for all users -->
<Property Id="ALLUSERS" Value="1"/>
<!-- initialize properties used for adjusting connection strings.
The user will provide valid property values through command-line -->
<Property Id="DB_SERVER_NAME" Value="please-specify-db-server-name"/>
<Property Id="DB_NAME" Value="please-specify-db-name"/>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="CompanyProgramFilesFolder" Name="CompanyName" >
<Directory Id="INSTALLDIR" Name="ProjectName">
<Directory Id="InstallDirApp" Name="Bin" />
</Directory>
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder" Name="Programs">
<Directory Id="AppProgramMenuDir" Name="$(var.ProductLocalName)">
<Component Id="ProgramMenuDir" Guid="*">
<RemoveFolder Id='AppProgramMenuDir' On='uninstall'/>
<RegistryValue Root='HKCU' Key='$(var.ApplicationRootRegistryKey)' Type='string' Value='' KeyPath='yes' />
</Component>
</Directory>
</Directory>
</Directory>
<DirectoryRef Id="InstallDirApp">
<Component Id="Executable" Guid="*">
<File KeyPath="yes" Source="$(var.MyProject.TargetPath)">
<Shortcut Id="ProgramMenuShortcut" Name="$(var.ProductLocalName)"
Directory="AppProgramMenuDir" Advertise="yes"
WorkingDirectory="InstallDirApp" Icon="AppIcon.ico" IconIndex="0"/>
</File>
</Component>
<!-- ConnectionStrings config file deployment and settings adjustment -->
<Component Id="ConnectionStrings.config" Guid="*">
<File KeyPath="yes" Source="$(var.Csob.ChequesScanning.SmartShell.TargetDir)ConnectionStrings.config" />
<!--</Component>
<Component Id="xml01" Guid="*">-->
<!--<Condition><![CDATA[NOT Installed]]></Condition>-->
<!-- this sets the connection strings according to provided parameters -->
<util:XmlFile Id="SetConnectionString" Action="bulkSetValue"
File="[#ConnectionStrings.config]"
ElementPath="//add" Name="connectionString"
Value="Data Source=[DB_SERVER_NAME];Initial Catalog=[DB_NAME];Integrated Security=True;Pooling=True"
Permanent="yes" />
</Component>
</DirectoryRef>
<Icon Id="AppIcon.ico" SourceFile="$(var.MyProject.ProjectDir)Resources\AppIcon.ico" />
<Feature Id="ProductFeature" Title="MyProjectName" Level="1">
<ComponentRef Id="Executable" />
<ComponentRef Id="ConnectionStrings.config"/>
<ComponentRef Id="ProgramMenuDir" />
</Feature>
</Product>
</Wix>
我尝试了以下步骤来解决问题,但没有任何帮助:
1)我已经分离了和to独立的组件。
2)我尝试在这些组件下添加NOT INstalled。
3)在安装过程中,我尝试将注册表值写入HKLM。我已经为该注册表值添加了一个RegistrySearch和属性,然后将该值用作条件(实际上只是替换了前面的“未安装”)。
有人能帮上忙吗?我做错了什么?
感谢您的建议
马雷克
发布于 2010-11-08 21:01:37
在HKMU (See reference)下将注册表项作为根目录。这将根据ALLUSERS属性的值在HKLM或HKCU中正确地设置注册表项的根。
https://stackoverflow.com/questions/4114201
复制相似问题