我该如何使用MSBuild远程启动/停止一个服务?

4
我想使用MSBuild远程启动或停止另一台机器上的Windows服务。为了实现这一点,我编写了以下脚本:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="C:\Program Files (x86)\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
  <Target Name="MyTarget">
    <ServiceController MachineName="Box2" ServiceName="MyService" Action="Stop" />
  </Target>
</Project>

当我在能够看到Box2的机器上运行时,我得到了以下结果:
Project "C:\Scripts\Test.xml" 在节点1(默认目标)上。 C:\Scripts\Test.xml(4,5): 错误: 无法在'Box2'上找到'MyService'服务。完成构建项目 "C:\ Scripts \ Test.xml"(默认目标) - 失败。
我知道我已经正确地输入了服务名称(我从实际的服务列表中复制并粘贴),而且我相当确定它可以看到Box2,因为如果我将其更改为不存在的机器名称(例如Box2asdf),它需要大约10秒钟才能返回(请注意,它返回完全相同的错误),而不是我提供正确的机器名称时几乎立即响应。
我该如何调试此问题?

我的服务是否已经安装在Box2上了? - Jorgen Thelin
3个回答

2

我可以让SC工作,但我想使用MSBuild。我也可以让命令执行。 - Mike Pateras

0
社区任务应该可以正常工作。只需使用 Sc 查询以检查服务是否正常工作即可。至于使用 msbuild,如果您在 exec 中封装 sc,则仍然使用 msbuild? 至少您的构建过程中不需要依赖第三方 dll。

0

ServiceController Target 在内部使用 ServiceController Class。但它不会返回未找到服务的原因。如果您确定计算机和服务名称均正确,则我建议分析的下一步是访问冲突问题。

而且,@jsobo 的回答可以非常有用地诊断实际原因,因为它可以显示没有 .Net 异常包装器的本地错误:

sc.exe \Box2 stop MyService


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接