如何使用MSBuild远程启动/停止服务?

时间:2011-02-13 00:04:09

标签: msbuild windows-services

我想使用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的机器上运行它时,我得到了这个:

  

项目   节点1上的“C:\ Scripts \ Test.xml”(默认值为   目标)。

     

C:\ Scripts \ Test.xml(4,5):错误:无法   找到'MyService'   'Box2'完工大楼服务   项目

     

“C:\ Scripts \ Test.xml”(默认目标) -   失败。

我知道我的服务名称是正确的(我从实际服务列表中复制并粘贴),我很确定它可以看到Box2,因为如果我将其更改为不存在的机器名称(例如Box2asdf),它需要大约10秒才能回来(请注意完全相同的错误),而不是我提供正确的机器名时几乎立即得到的响应。

我该如何调试此问题?

3 个答案:

答案 0 :(得分:2)

您可以尝试这样做......

您可以使用命令行程序sc并执行...

SC \ ServerName停止ServiceName

http://support.microsoft.com/kb/166819

有关如何从msbuild执行命令的更多信息,请查看此信息。 execute a command with parameters using msbuild

答案 1 :(得分:0)

社区任务应该有效。只需使用Sc查询来检查服务是否正常工作。至于使用msbuild如果你在一个exec中包装sc仍然使用msbuild? 至少你没有在构建过程中依赖第三方dll。

答案 2 :(得分:0)

ServiceController Target内部使用ServiceController Class。但它没有返回无法找到服务的原因。如果您确定计算机和服务名称都是正确的,那么接下来我建议分析的是访问冲突问题。

@ jsobo的答案对于诊断实际原因非常有用,因为它可以显示原生错误,而不会有.Net异常包装器:

  

sc.exe \ Box2停止MyService