安装了新的 Windows 服务,无法启动:“系统错误 2 ...系统找不到指定的文件”

Posted

技术标签:

【中文标题】安装了新的 Windows 服务,无法启动:“系统错误 2 ...系统找不到指定的文件”【英文标题】:New Windows Service installed, fails to start: "System error 2 ... system cannot find the file specified" 【发布时间】:2013-11-16 22:58:40 【问题描述】:

我已经成功安装了其他几个自定义的 .Net windows 服务。我最近写的一个新的与其他的非常相似,虽然它安装没有错误 - 在使用服务控制器启动它时,它无法以错误对话框启动:系统错误 2 ...系统找不到指定的文件。

经过时间和惊愕之后,我唯一能想到的与此服务显着不同的是路径和可执行文件名称至少比我的其他任何服务长 10 个字符。在缩短路径和 .exe 名称并重新安装时,服务运行良好:没有错误!我只能假设我以前的路径或服务或 .exe 名称太长。

另外,值得一提的是,我使用了一些借用的内置到我的 exe 中的“服务驱动程序”代码,通过 win API 调用处理服务控制器的服务安装/卸载。可能是该服务驱动程序模块中隐藏了字符限制。

我找不到任何与 Windows 相关的文档来确认我已超出的路径或服务名称是否存在系统绑定字符限制。当时间允许时,我会深入研究服务驱动程序,看看这是否是问题所在。同时,我欢迎任何见解。

【问题讨论】:

缩短之前的路径总长度是多少。还有你的路径有什么不寻常的字符吗?如果您还可以提供所使用的初始路径,这也将有助于任何尝试回答您的查询的人 工作服务现在的可执行名称长度为 17。不幸的是,我没有保存旧的,但它接近 30 或 35 个字符。服务名称(服务控制器名称)相同(不带 .exe 扩展名),服务控制器中显示的服务标题约为 40-50 个字符。 exe 的总本地完整路径大约有 100 个字符,现在它正在工作,路径是 67 个字符。我可以编写一些测试项目并改变长度来检查失败。主要是想知道是否有一些已知的记录限制。 如果不知道确切的路径长度或最初的设置方式,很难提供帮助。仅供参考,此类问题应发布在Server Fault 【参考方案1】:

sys 文件被阻止的另一个可能原因。如果您的驱动程序没有明确退出(例如,您忘记清理设备、标注等),则 sys 文件可能被阻止。要检查您是否可以尝试在服务不工作时删除 sys 文件。通常你应该可以这样做。如果没有,驱动程序可能会占用一些资源,进而阻塞 sys 文件。

如果您的服务确实阻止了该文件,您应该将服务启动设置为手动(检查HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\YourServiceName\Start 标志:0 - 启动时启动,3 - 手动)并重新启动您的设备。这将释放 sys 文件,您可以重试,直到修复清理流程。

【讨论】:

【参考方案2】:

就我而言,我打开命令提示符并导航到 exe 并从那里安装它。所以我没有输入完整路径。一旦我使用了完整路径,它就起作用了。

    因此,您需要在系统环境变量中使用完整路径安装服务将 exe 文件的路径添加到 PATH

     SC CREATE "Service-Name" binpath="D:\full-path-to-service\service.exe"
    

    或将D:\full-path-to-service\ 添加到PATH 变量并使用

     SC CREATE "Service-Name" binpath="service.exe"
    
    另外,验证路径是否正确。因为,我曾经用错误的路径安装成功了,但是当我尝试启动它时,我得到了同样的错误。

【讨论】:

另一种选择是将注册表编辑器中的“ImagePath”属性更改为完整路径。该服务的密钥可以在 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\your_service 中找到。将 ImagePath 值更改为完整路径,它可以工作【参考方案3】:

就我而言,问题是由服务启动例程中的错误引起的。 DriverEntry(在我的情况下是内核模式驱动程序)返回错误的状态值。我认为这种情况也适用于用户模式。

【讨论】:

坏状态值本身不是问题。问题是您的驱动程序在错误时没有明确退出。我猜你持有一些资源,这会阻止sys 文件,因此无法访问它。例如,在我的情况下,我忘记在设备卸载时取消注册标注。这会导致sys 文件被阻塞,因此无法再次启动。【参考方案4】:

我遇到了同样的问题,没有解决这个错误,然后我通过 not 使用c:\Windows\System32 路径来存储服务可执行文件来解决!

【讨论】:

感谢 Zac,我试图在以管理员身份打开的 cmd 中设置路径,但它不起作用。但是当我以管理员身份登录回服务器时,我能够创建并启动服务【参考方案5】:

我遇到了类似的服务问题,我遇到了同样的错误。

我去了:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\YourServiceName\ImagePath

我的“ImagePath”被设置为存在于“C:\”上的名为“W:\”的虚拟驱动器。 我将此路径替换为 C:\ 驱动器上的实际文件位置,然后服务成功启动

【讨论】:

【参考方案6】:

我的问题是,使用 Powershell 命令创建服务会在注册表中添加诸如 <C:\Path\To\Service\Service.exe> 之类的括号。

Replacing < and > with " fixed it for me.

【讨论】:

【参考方案7】:

我尝试了一些测试服务,发现并不是任何属性的长度导致了我的问题(“系统错误 2 ... 系统找不到指定的文件”)。我的内置服务安装程序使用三个属性:ServiceName、ServiceTitle、ServiceDescription。在安装时,我发现它会将完整的服务路径写入注册表,但它不只是使用实际的 exe(程序集)名称,它使用 ServiceName 属性来构建路径!我的问题是 ServiceName 和程序集名称不匹配,因此找不到文件。我使用了一个 powershell 注册表查询来公开路径,最后从那里注意到了不匹配。当我第一次注意到这个问题时,我并没有注意到,当我将服务名称从任何内容中缩短时——我只是使用了不带 .exe 的程序集名称,而这实际上是修复它,而不是简单地缩短它。

【讨论】:

powershell 注册表查询是什么? 路径可以在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\YourServiceName\ImagePath找到。 太棒了,先生。就我而言,我将命令提示符设置为 EXE 文件夹,因此 ImagePath 有 .exe 但没有任何路径信息 =( 我遇到了完全相同的问题,10 倍。 我正在使用 sc 命令安装我的并且遇到了同样的问题。阅读完所有信息后,我所要做的就是提供完全合格的 EXE 路径,它现在可以启动了!

以上是关于安装了新的 Windows 服务,无法启动:“系统错误 2 ...系统找不到指定的文件”的主要内容,如果未能解决你的问题,请参考以下文章

Windows 资源保护无法启动修复服务

mongodb安装到windows服务后,无法启动

如何解决Win10系统无法启动Windows安全中心服务的问题

windows系统安装-无法引导启动-bootmgr-is-missing

Windows Server 2016-Nano Server介绍

Windows无法启动 Diagnostic policy service服务(位于本地计算机上)错误1069:由于登录失败而无法启动服务