我已经成功安装了其他几个自定义.Net windows服务。我最近写的一个新的与其他的非常相似,当它安装时没有错误-在用服务控制器启动它时,它无法启动并显示错误对话框:系统错误2…系统找不到指定的文件。
经过一段时间和惊愕之后,我能想到的唯一一件事是,这个服务的路径和可执行文件的名称至少比我的任何其他服务长10个字符。缩短路径和.exe名称并重新安装后,服务运行正常:没有错误!我只能假设我以前的路径或服务或.exe名称太长。
此外,这将是相关的提及,我已经使用了一些借来的“服务驱动程序”代码内置到我的exe来处理安装/卸载服务的服务控制器通过win API调用。可能是服务驱动程序模块中隐藏了字符限制。
我找不到任何windows相关的文档来确认是否有一个系统绑定字符限制到一个路径或服务名称,我已经超过了。当时间允许的时候,我会深入了解服务司机,看看这是否是问题所在。同时,我欢迎任何见解。
9条答案
按热度按时间qhhrdooz1#
我对一些测试服务进行了试验,发现导致我的问题的不是任何属性的长度(“系统错误2...系统找不到指定的文件”)开始。
我的内置服务安装程序使用三个属性:ServiceName、ServiceTitle、ServiceDescription。在安装时,我发现它向注册表写入了一个完整的服务路径,但它不只是采用实际的
exe
(程序集)名称,它使用ServiceName属性来构建路径!我的问题是ServiceName和程序集名称不匹配,因此找不到文件。我使用PowerShell注册表查询来公开路径,最终注意到不匹配。
当我第一次注意到这个问题时,我没有注意到当我缩短服务名称时-我只是使用了没有.exe的程序集名称,这就是实际解决它的方法,而不是简单地缩短它。
eyh26e7m2#
我在一个服务上遇到了类似的问题,在那里我得到了同样的错误。
我去了:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\YourServiceName\ImagePath
我的“ImagePath”被设置为一个名为“W:\”的虚拟驱动器,该驱动器位于“C:\”上。
我将此路径替换为C:\驱动器上的实际文件位置,然后服务成功启动
zu0ti5jz3#
在我的例子中,我打开命令Promt并导航到exe并从那里安装它。所以我没有进入完整的路径。一旦我使用了完整路径,它就起作用了。
1.因此,您需要使用完整路径安装服务或在系统环境变量中将exe文件的路径添加到PATH。
或将
D:\full-path-to-service\
添加到PATH变量并使用1.此外,请验证路径是否正确。因为,我曾经安装了错误的路径,它得到了成功安装,但当我试图启动它,我得到了同样的错误。
hivapdat4#
我的问题是,使用PowerShell命令创建服务添加了以下括号:
<C:\Path\To\Service\Service.exe>
到注册表。kiz8lqtg5#
我遇到了同样的问题,没有解决这个错误,然后我解决了不使用
c:\Windows\System32
路径存储服务可执行文件!lh80um4z6#
在我的例子中,问题是由服务启动例程中的错误引起的。DriverEntry(在我的例子中,它是一个内核模式驱动程序)返回一个错误的状态值。我认为这种情况也适用于用户模式。
klr1opcd7#
sys
文件被阻止的另一个可能原因。如果您的驱动程序没有清楚地退出(例如,您忘记清理设备,标注等),sys文件可能会被阻止。要检查您是否可以在服务不工作时尝试删除sys
文件。通常你应该能够做到这一点。如果没有,驱动程序可能会占用一些资源,进而阻止sys文件。如果您的服务确实阻止了该文件,则应将服务启动设置为手动(检查
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\YourServiceName\Start
标志:0 - Boot 时启动,3 -手动)并重新启动您的设备。这将释放sys文件,您可以重试,直到您修复清理流。mo49yndu8#
嗯,有一个路径限制,但不确定在这个运动的字符限制。此外,文件名应与exe名称匹配。sc createMyWinServiceBinPath= C:\System32\Queue\MyWinService.exe
nom7f22z9#
对我来说,问题是我是从Azure Dev Ops部署的。Release定义中的命令行脚本在代理计算机而不是目标计算机上运行它。
使用服务器名称参数指定要在其上注册服务的服务器,即
sc \\TargetServer ...
解决了这个问题。