【问题标题】:.net ServiceController - Unable to open service "service name" in machine '.'.net ServiceController - 无法在机器“。”中打开服务“服务名称”。
【发布时间】:2009-09-22 15:57:17
【问题描述】:

我正在尝试使用 ServiceController 通过 WinForms 应用程序访问 Windows 服务(也是我创建的):

service = new System.ServiceProcess.ServiceController("MyService")

服务返回正常,我可以通过myservice.Status查看状态。

但是当我尝试启动(或停止)它时,它会返回错误:

无法在机器“。”中打开服务 MyService。

我是管理员,服务进程作为 NetworkService 运行。

我是 .net 和 windows 应用程序的新手,我似乎无法进一步调试它。

【问题讨论】:

    标签: .net windows-services


    【解决方案1】:

    我终于能够通过在 app.manifest (project->new item->application manifest) 中设置执行级别来解决这个问题

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
    

    现在控制应用程序需要管理员权限,因此可以毫无问题地启动/停止服务。

    不过,我相信我可以通过代码使用模拟或以某种方式降低服务运行级别以其他方式做到这一点。

    在启动应用程序之前,我必须对此进行审查,然后我会在此处发布我的发现。

    感谢 Drew 在整个调试过程中提供的指导。

    问候

    【讨论】:

      【解决方案2】:

      您确定您使用的是 service 名称而不是 display 名称吗?

      仔细检查您是否是该框的本地管理员。

      服务是否在本地机器上运行?我不确定您为什么看到主机名“。”

      编辑:

      我在网上看到,如果Test Service 不是有效的服务 名称,则以下代码会抛出InvalidOperationException

      var sc = new ServiceController("Unknown Service");
      string name = sc.DisplayName;
      

      documentation for this constructor 并不表示它会抛出异常,所以我猜你需要使用服务名称。您在之后看到的任何异常实际上都是一个真正的错误。

      希望这更清楚。

      【讨论】:

      • 我想我用对了,它是“MySMS 服务”。服务属性中的实际服务名称(“MySMS_Service”)在 service.Status 上出错,所以我认为“MySMS 服务”是正确的,因为返回了“已停止”状态。是的,我的用户帐户具有管理员权限。是的,服务在本地机器上运行,我没有设置 MachineName 属性,所以它应该默认为本地机器。
      • 我已经更新了答案。我相信您需要使用服务名称,而不是显示名称。
      • 好的,确保我使用了 ServiceController.GetServices() 并循环了所有服务 - serviceName 确实是“MySMS 服务”。 - 我可以状态并获取它的 DisplayName 等 - 但只有当我尝试启动或停止时它才会返回“无法在机器'.'中打开服务 MySMS 服务。”
      • 您看到的异常类型是什么?此外,您正在运行的代码正在使用哪些凭据?你确定它在使用你的凭据吗?
      • 还有一个问题——如果您使用services.mmcsc.exe,它会开始吗?
      猜你喜欢
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多