【问题标题】:Cannot start service on computer '.'无法在计算机“。”上启动服务
【发布时间】:2016-10-05 16:34:43
【问题描述】:

我正在尝试使用 PowerShell 创建和启动 Windows 服务。

当我使用除一个特定名称之外的各种名称时,服务已创建但无法启动。

当我使用 exe 文件的名称创建服务时,它可以启动,但是当我给它一个不同的名称时,它无法启动。

我正在以管理员身份运行 PowerShell 脚本。

有什么建议吗?

function InstallService(
    [string] $MsDeployHost,
    [string] $ServiceName,
    [string] $DisplayName,
    [string] $ServicePath,
    [string] $ServiceDescription,
    [object] $Credential) {
    if($MsDeployHost -eq "local") {        
        New-Service -name $ServiceName -binaryPathName $ServicePath -displayName $ServiceName -StartupType Automatic
        Start-Service -name $ServiceName
    } else { ....  

我得到的错误: 启动服务:服务'Service1 (Service1)' 由于以下错误而无法启动: 无法在计算机“.”上启动服务 Service1。

当我尝试手动启动它时,我得到: “错误 1053:服务没有及时响应启动或控制请求”

【问题讨论】:

  • 请与我们分享您的代码。
  • 定义“启动失败”。你得到一个错误?什么错误?事件日志中有什么相关的吗? $ServicePath 是否包含可执行文件的完整路径,包括可执行文件名称?
  • 我收到以下错误:
  • 你试过从服务控制管理器启动它吗?

标签: powershell


【解决方案1】:

问题在于,除非您的服务被编写来处理它,否则您需要使用特定的服务名称来运行特定的服务(并注意名称区分大小写) .这是因为服务在启动时需要向服务控制管理器注册以接收启动/停止通知并使用其服务名称发送状态更新。如果您使用不同的名称安装服务,但可执行文件无法知道这一点(通过配置设置或诸如此类),则此注册将失败并且服务无法启动(对于操作系统,它看起来好像服务没有响应)。

您可以将显示名称设置为您喜欢的任何名称,但您不能使用任意服务名称,除非该服务旨在支持这一点。

【讨论】:

  • 我尝试使用 TopShelf 将 API 安装为 Windows 服务。我将 Topshelf 配置为使用服务名称“service1”,但是当我使用 powershell 命令“New-Service”安装时,我使用的是名称“service2”。这条评论让我意识到为什么它不起作用!
  • @jeroen-mostert 问题的代码中究竟有什么需要改变的? “特定服务名称”是什么意思?
  • @Thomas:最终,当代码调用StartServiceControlDispatcher 时,它必须在SERVICE_TABLE_ENTRY 结构中提供服务控制管理器期望的服务名称(即,在该服务已在CreateService 注册)。现在,这对您的代码实际上意味着什么,很大程度上取决于最终调用该函数的方式;人们很少直接使用这些 Win32 函数。
  • 在PowerShell的特殊情况下,它只是意味着当你调用New-Service时,你必须使用服务代码所期望的服务名称。当使用像 Topshelf 这样的通用包装器时,此名称是可配置的,因此您只需确保在包装器配置和服务安装中使用相同的名称。对于其他服务可执行文件,服务名称可能不可配置,然后您只需要知道它使用的名称即可。
  • 如果您想知道为什么这甚至是必要的:可以在一个可执行文件中托管多个服务,以减少资源使用。当可执行文件启动时,它会为服务控制管理器提供它所托管的服务列表。当服务启动时,服务控制管理器会尝试将服务名称与可执行文件提供的服务列表相匹配。如果没有匹配项,则该服务似乎在运行中丢失。如果没有此功能,SCM 可以简单地假设可执行文件托管一个服务,并且不需要匹配任何名称。
【解决方案2】:

我的问题是服务控制管理器中的服务是Disabled

然后我将其置于manual 状态,Start-Service 工作。

【讨论】:

  • 跟我遇到的问题一模一样,有帮助!
【解决方案3】:

我遇到了同样的问题,对我来说,问题是该服务应该使用用户的凭据运行并且用户的密码已更改 - 之后该服务无法再登录并且无法运行。

您可以在失败后立即查看“服务控制管理器”日志,如下所示:

> Get-EventLog -LogName System -Source 'Service Control Manager' -Newest 5

   ----- ----          ---------   ------                 ---------- -------
   19762 Sep 30 12:31  Error       Service Control M...   3221232472 The SERVICE_NAME service failed to start due to the following error: ...
   19761 Sep 30 12:31  Error       Service Control M...   3221232510 The SERVICE_NAME service was unable to log on as .\USERNAME with the currently configured password due to the following error: ...
#...
> (Get-EventLog -LogName System -Source 'Service Control Manager' -Newest 5)[1] | Format-List


Index              : 19764
EntryType          : Error
InstanceId         : 3221232510
Message            : The SERVICE_NAME service was unable to log on as .\USERNAME with the currently configured password due to the following error:
                     %%1326

                     To ensure that the service is configured properly, use the Services snap-in in Microsoft Management Console (MMC).
Category           : (0)
CategoryNumber     : 0
ReplacementStrings : {SERVICE_NAME, .\USERNAME, %%1326}
Source             : Service Control Manager
TimeGenerated      : 9/30/2021 12:35:02 PM
TimeWritten        : 9/30/2021 12:35:02 PM
UserName           :


错误 1326 是“错误的用户名或密码”。

【讨论】:

  • 谢谢,这里最有帮助的评论,以获取有关它无法启动的原因的一些详细信息
【解决方案4】:

如果这也是一个 .NET 控制台应用程序,则必须在 Program.cs 的主方法中调用 ServiceBase.Run。这为我解决了这个错误。

在此处查看更具体的代码: .NET console application as Windows service

【讨论】:

    【解决方案5】:

    对我来说,appsettings.json 中的值不正确。没有转义一些特殊字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2014-06-26
      相关资源
      最近更新 更多