Wix 使用Windows服务更新包将重置服务';帐户和密码
我正在用WiX安装MSI。我正试图让开发过程尽可能简单:这是一个内部产品,我的用户是我们的IT人员 该产品包括一个Windows服务,必须将其配置为在每台计算机的不同帐户下运行 我为我的用户(首次安装)计划的工作流程如下:Wix 使用Windows服务更新包将重置服务';帐户和密码,wix,Wix,我正在用WiX安装MSI。我正试图让开发过程尽可能简单:这是一个内部产品,我的用户是我们的IT人员 该产品包括一个Windows服务,必须将其配置为在每台计算机的不同帐户下运行 我为我的用户(首次安装)计划的工作流程如下: 运行安装程序 (安装程序在默认帐户下设置服务) 通过sc或本地服务小程序停止服务 更新服务属性以在正确的计算机特定帐户下运行。 (每台机器的帐户不同,只有IT人员可以访问密码。) 重新启动服务 后续更新包括从更新的MSI文件安装 在测试“小型”更新时,我惊讶地发现安装程序将服
sc
或本地服务小程序停止服务.wxs
文件中的外观:
<Component Id="cmpService" Guid="{MYGUIDHERE}">
<File Id="filService" KeyPath="yes" Name="ServiceApp.exe" />
<ServiceInstall Id="ServiceInstall" Name="ServiceApp" DisplayName="My Service"
Type="ownProcess" Start="auto" ErrorControl="normal"
Account="LocalSystem">
<util:PermissionEx ... attributes here... />
</ServiceInstall>
<ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall"
Name="ServiceApp" Wait="yes" />
</Component>
我原以为Remove=“uninstall”
会在没有更改的情况下保留服务。显然不是。(如果这种情况发生在“重大”更新中,我并不太担心)
我还注意到,ServiceConfig
元素的属性(OnReinstall
)似乎符合要求,但根据错误消息,很明显,OnReinstall
只影响元素的配置成员(PreShutdownDelay
,等等)而不是整个服务安装
我已经研究过这些:
在安装过程中提示输入帐户和密码是可以的,但在这种情况下,将密码存储在注册表或其他地方并不是一个真正的选项,每次更新都必须重新输入凭据,这与手动重新配置服务一样具有破坏性。我今天与FireGiant通了一个咨询电话,就这个问题进行了咨询,我们找到了解决方案 背景故事:
- 我们的应用程序安装MSI最初使用
安装Windows服务,但是我们的实际桌面软件将其更改为LocalService
,甚至在某些网络环境中可能需要自定义用户帐户NetworkService
- 我们的
元素具有
,如下所示:Account=“NT AUTHORITY\LocalService”
<Component Id="Comp_File_OurServiceExe" Guid="*"> <File Source="$(var.TargetDir)OurService.exe" id="File_OurServiceExe" KeyPath="yes" /> <ServiceInstall Id = "ServiceInstall_OurServiceExe" Vital = "yes" Name = "RussianSpyingService" DisplayName = "Russian Spying Service" Description = "Crawls your network for incriminating files to send to the FSB" Account = "NT AUTHORITY\LocalService" Type = "ownProcess" Arguments = "-mode service" Interactive = "no" Start = "auto" ErrorControl = "normal" > <ServiceConfig DelayedAutoStart="yes" OnInstall="yes" OnUninstall="no" OnReinstall="yes" /> <util:ServiceConfig FirstFailureActionType="restart" SecondFailureActionType="restart" ThirdFailureActionType="none" ResetPeriodInDays="1" /> </ServiceInstall> </Component>
- 更新你的
最终为我工作的是
<DeleteServices><![CDATA[REMOVE ~= "ALL" AND (NOT UPGRADINGPRODUCTCODE)]]> </DeleteServices> <InstallServices><![CDATA[NOT Installed]]> </InstallServices>
我通过一系列尝试和错误的尝试,以及其他几个具有类似答案的线索的组合,得出了这个答案
唯一不起作用的可能原因之一是WIX在重新安装时也会删除该服务。。我们只想在初始安装期间安装一次服务。我们还希望确保卸载时删除该服务。这是唯一对我有效的条件组合,允许服务保留其设置和用户帐户。您是否了解过这一点?您是否得到了这一点的答案。面对同样的问题…任何线索都很好…@user2717225,我没有其他线索。我们不需要发布很多更新,所以这对我们来说并不像我担心的那样重要。这是一个讨厌的问题。不幸的是,使用自定义用户帐户,我无法使其完全工作。实现此解决方案后,它将保留服务帐户名,但无法启动服务,我怀疑这是因为缺少密码。它会在安装过程中失败,提示重试/忽略。我只能手动打开services.msc,导航到该服务,在安装程序提示/警告无法成功安装该服务时输入正确的密码,然后单击“重试”,才能使安装成功。这对我来说很有效!这两个答案也有助于理解为什么这样做:stackoverflow.com/a/17608049/670028和stackoverflow.com/a/321874/670028<ServiceInstall Id = "ServiceInstall_OurServiceExe" Vital = "yes" Name = "RussianSpyingService" DisplayName = "Russian Spying Service" Description = "Crawls your network for incriminating files to send to the FSB" Account = "[SERVICE_ACCOUNT_NAME]" Type = "ownProcess" Arguments = "-mode service" Interactive = "no" Start = "auto" ErrorControl = "normal" > <ServiceConfig DelayedAutoStart="yes" OnInstall="yes" OnUninstall="no" OnReinstall="yes" /> <util:ServiceConfig FirstFailureActionType="restart" SecondFailureActionType="restart" ThirdFailureActionType="none" ResetPeriodInDays="1" /> </ServiceInstall>
<DeleteServices><![CDATA[REMOVE ~= "ALL" AND (NOT UPGRADINGPRODUCTCODE)]]> </DeleteServices> <InstallServices><![CDATA[NOT Installed]]> </InstallServices>