【发布时间】:2021-07-17 13:09:41
【问题描述】:
我正面临一个非常特殊的问题。我有一个 .net 核心 Windows 服务 (XYZ),其安装程序 (XYZ.msi) 是使用 Wix 创建的。我正在尝试将此服务安装在容器中。该服务被安装,然后 Windows 尝试将其注册为服务,该服务超时在系统事件日志The XYZ Service (XYZ) service failed to start due to the following error: %%1053 A timeout was reached (30000 milliseconds) while waiting for the XYZ service (XYZ) service to connect. 中向我提供以下“信息”,然后该服务被卸载,这是预期的。
当我进一步检查应用程序事件日志时,我得到了这些
Product: XYZ -- Error 1920. Service 'XYZ' (XYZ) failed to start. Verify that you have sufficient privileges to start system services.
Windows Installer installed the product. Product Name: XYZ. Product Version: 0.0.0.0. Product Language: 1033. Manufacturer: .... Installation success or error status: 1603.
所以为了理解这些错误代码,我参考了Error Code 1603 和错误 1920 上的一些其他链接,但由于这些非常通用,这些链接没有用。
相同的服务在本地和不同的服务器上运行良好。
XYZ.msi所在的容器内的文件夹有这些权限
Path : Microsoft.PowerShell.Core\FileSystem::C:\app
Owner : NT AUTHORITY\SYSTEM
Group : NT AUTHORITY\SYSTEM
Access : BUILTIN\Administrators Allow FullControl
BUILTIN\Administrators Allow 268435456
NT AUTHORITY\SYSTEM Allow FullControl
NT AUTHORITY\SYSTEM Allow 268435456
NT AUTHORITY\Authenticated Users Allow Modify, Synchronize
NT AUTHORITY\Authenticated Users Allow -536805376
BUILTIN\Users Allow ReadAndExecute, Synchronize
BUILTIN\Users Allow -1610612736
Audit :
Sddl : O:SYG:SYD:(A;ID;FA;;;BA)(A;OICIIOID;GA;;;BA)(A;ID;FA;;;SY)(A;OICIIOID;GA;;;SY)(A;ID;0x1301bf;;;AU)(A;OICIIOID;SDGXGWGR;;;AU)(A;ID;0x1200a9;;;BU)(A;OICIIOID;GXGR;;;BU)
另外我假设所有的安装都是使用容器内的 ContainerAdministrator 帐户进行的。
现在我无法弄清楚问题是什么,如何进一步排除故障,以及如果它是权限问题,我需要设置哪些权限。在这方面的任何帮助将不胜感激。谢谢!
编辑: dockerFile 看起来像这样
FROM mcr.microsoft.com/windows/servercore:ltsc2019-amd64
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
WORKDIR /app
COPY [".","."]
RUN ["powershell.exe", "./install.cmd"]
WiX .wxs 代码
<Fragment>
<ComponentGroup Id="ServiceComponents" Directory="APPLICATIONFOLDER">
<Component Id="ServiceComponent" Guid="649E5964-126A-4DF5-95CF-CE7C2474E981">
<File Id="xyz.exe" KeyPath="yes" Vital="yes" DiskId="1" Source="..\xyz\bin\$(var.Platform)\$(var.Configuration)\netcoreapp3.1\win-x64\xyz.exe"/>
<ServiceInstall
Id="ServiceInstaller"
Type="ownProcess"
Vital="yes"
Name="xyz"
DisplayName="$(var.ProductName)"
Description="$(var.Description)"
Start="auto"
Account="NT AUTHORITY\LocalService"
ErrorControl="normal" Interactive="no">
<ServiceConfig DelayedAutoStart="yes" OnInstall="yes" OnReinstall="yes" />
<util:ServiceConfig FirstFailureActionType="restart" SecondFailureActionType="restart" ThirdFailureActionType="none" ResetPeriodInDays="1" RestartServiceDelayInSeconds="0" />
</ServiceInstall>
<ServiceControl
Id="ServiceController"
Name="xyz"
Start="install"
Stop="both"
Remove="both"
Wait="yes" />
</Component>
</ComponentGroup>
</Fragment>
【问题讨论】:
-
您是否真正验证过它在安装时作为 ContainerAdministrator 运行?你的 Dockerfile 是什么样的?
-
这只是一个假设,尚未验证。有没有办法我可以做到这一点?我也会添加我的 dockerfile
-
您是否尝试过构建 2019 ltsc2019 服务器核心 VM 并在其上安装 MSI?
-
尝试同时使用
mcr.microsoft.com/windows/servercore:ltsc2019-amd64和mcr.microsoft.com/windows/servercore:ltsc2019 -
要检查什么用户在运行,你只需要添加一条类似
RUN echo %USERNAME%的指令,它就会在docker build的输出中输出它是什么用户。根据您的 Dockerfile,它将作为 ContainerUser 运行,而不是 ContainerAdministrator。
标签: docker .net-core wix user-permissions