我已成功安装了其他几个自定义.Net Windows服务。我最近编写的一个新版本与其他版本非常相似,并且安装时没有错误 - 在启动它时,服务控制器无法启动错误对话框:系统错误2 ...系统无法找到指定的文件。
经过一段时间和惊愕之后,我唯一能想到的就是这个服务的唯一不同之处在于路径和可执行文件名称比我的其他任何服务都长至少10个字符。在缩短路径和.exe名称并重新安装时,服务运行良好:没有错误!我只能假设我以前的路径或服务或.exe名称太长。
此外,提及我使用内置于我的exe中的一些借用的“服务驱动程序”代码来处理通过win API调用向服务控制器安装/卸载服务是恰当的。可能是该服务驱动程序模块中隐藏的字符限制。
我找不到任何与Windows相关的文档来确认是否存在我已超出的路径或服务名称的系统限制字符限制。我会在时间允许的情况下深入了解服务驱动程序,看看是否有问题。同时我欢迎任何见解。
答案 0 :(得分:35)
我尝试了一些测试服务,发现它不是导致我的问题的任何属性的长度(“系统错误2 ...系统找不到指定的文件”)开始。我的内置服务安装程序使用三个属性:ServiceName,ServiceTitle,ServiceDescription。在安装时,我发现它将完整的服务路径写入注册表,但它不仅仅采用实际的exe(程序集)名称,它使用ServiceName属性来构建路径!我的问题是ServiceName和程序集名称不匹配,因此找不到文件。我使用了powershell注册表查询来公开路径,并最终注意到那里的不匹配。当我第一次注意到这个问题时,我没有注意到,当我缩短服务名称时,我只使用了没有.exe的程序集名称,这就是实际修复它的原因,而不是简单地缩短它。
答案 1 :(得分:3)
我在服务中遇到了类似的问题,在此我遇到了相同的错误。
我去了:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ YourServiceName \ ImagePath
我的“ ImagePath”被设置为存在于“ C:\”上的名为“ W:\”的虚拟驱动器。
我将此路径替换为C:\驱动器上的实际文件位置,然后该服务成功启动
答案 2 :(得分:1)
我的问题是,使用Powershell命令创建服务时,向注册表中添加了像<C:\Path\To\Service\Service.exe>
这样的大小写。
Replacing < and > with " fixed it for me.
答案 3 :(得分:0)
就我而言,我打开了命令提示符,并导航到该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"
答案 4 :(得分:0)
我遇到了同样的问题,没有任何办法解决此错误,然后我通过使用c:\Windows\System32
路径来存储服务可执行文件的方法来不解决了!
答案 5 :(得分:0)
就我而言,问题是由服务启动例程中的错误引起的。 DriverEntry(在我的情况下是内核模式驱动程序)返回错误的状态值。我认为这种情况也适用于用户模式。