释放 IIS 保存的文件

问题描述 投票:0回答:1

我们有一个 WiX 安装程序,在升级过程中有时需要重新启动系统,因为文件被未命名的进程占用(日志文件不显示占用进程名称)

我们猜测 IIS 持有该文件,因此我们编写了 ServiceControl 元素来停止 IIS 服务。

<Component Id="RestartIis" Guid="{XXXXXXXX}" Transitive="yes">
    <CreateFolder />
    <ServiceControl Id="RestartIis" Name="IISADMIN" Start="both" Stop="both" />
    <ServiceControl Id="RestartW3SVC" Name="W3SVC" Start="both" Stop="both" />
</Component>

尽管如此,该文件仍处于使用状态。 我们尝试添加 RestartResource 元素来关闭 w3wp 进程,但没有成功:

<util:RestartResource Id="w3wp1" ProcessName="w3wp.exe" />

问题仅发生在我们的 CI 服务器上

有人遇到过这种情况吗?任何帮助将不胜感激!

iis wix
1个回答
0
投票

如果您有 .Net core IIS 应用程序,此解决方案可能适合您。

我花了很多时间来弄清楚如何停止 IIS 应用程序池或 IIS 应用程序。 .Net 框架 IIS 应用程序不会锁定文件 - wix 安装程序可以对文件执行任何操作(尤其是删除它们),因此不会显示 FilesInUse 窗口。 ASP .Net core IIS 服务确实会锁定文件,并且会弹出 FilesInUse。要解锁它们,您必须停止 IIS 应用程序池(需要提升权限,这非常复杂,稍后会回到它)或在 .net core webservice 目录中创建一个名为“app_offline.htm”的文件 - 这会停止服务并解锁文件。

“app_offline.htm”解决方案 - 我刚刚创建了一个自定义操作,该操作在 InstallValidate 之前在特定目录中创建一个文件,并在 RemoveFolders 之前删除该文件。 以下是有关“app_offline.htm”文件的更多信息:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/app-offline?view=aspnetcore-8.0

第二个解决方案是通过具有提升权限的自定义操作来停止 iis 应用程序池。基本上,您无法在 InstallValidate 步骤之前运行提升的命令(在此步骤期间或之后,会弹出 FilesInUse 窗口)。要么你会立即采取无法提升的行动 (表示自定义操作将在正常处理时间内以用户权限运行。) 或者您将拥有deferred自定义操作( 表示自定义操作在脚本中运行(可能具有提升的权限)。) + impersonate:“否”(提升的权限)...不能在 InstallValidate 之后的 InstallInitialize 之前运行。 https://wixtoolset.org/docs/v3/xsd/wix/customaction/ 您可以做的是使用用户权限运行操作,但确保用户具有提升的权限。您可以在安装开始之前在验证步骤中检查它。这种情况很糟糕,因为用户可能必须以管理员权限运行 cmd,然后从那里调用 msi。另一种选择是创建一个 wix 引导程序 (.exe),它将运行可能位于 exe 内的 msi。我没有检查该解决方案,因为它对我来说没有意义,但您应该能够轻松找到有关该解决方案的更多信息。最后一个选项 - 您可以创建自提升的 msi(通过使用自定义操作以提升的权限重新启动 msi)。 http://lists.wixtoolset.org/pipermail/wix-users-wixtoolset.org/2016-September/003259.html 但不建议这样做,而且它有自己的问题。对于自提升的 msi 和引导程序,如果您/安装程序的用户使用 msi 的任何参数 - 您将必须在重新启动应用程序或在引导程序内部时转发它们。对我来说这是最后的手段。我尝试了自提升的 msi,它正在工作,但后来我找到了第一个解决方案(经过大量搜索之后),这是一个更干净的选项。

© www.soinside.com 2019 - 2024. All rights reserved.