2011-02-13 85 views
3

我想远程启动或停止使用MSBuild的另一台机器上的Windows服务。要做到这一点,我写这个剧本:如何使用MSBuild远程启动/停止服务?

<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,我得到这个:

项目 “C:\脚本\的test.xml”在节点1上(默认为 目标)。

C:\脚本\的test.xml(4,5):错误:无法 找到 '的MyService' 上 'BOX2' 服务完成正在 项目

“C:\脚本\ Test.xml“(默认目标) - FAILED。

我知道我有服务名称正确的(我复制并从实际服务列表贴吧),我敢肯定,它可以看到BOX2,因为如果我将其更改为那并不是一个机器名(例如Box2asdf),它需要大约10秒钟的时间(与你完全相同的错误,请注意),而不是我提供正确机器名称时得到的即时响应。

我该如何调试此问题?

+0

是MyService实际安装在Box2上? – 2011-02-13 01:09:17

+0

是的,它正在运行。 – 2011-02-13 02:51:33

回答

0

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

0

ServiceController Target内部使用ServiceController Class。但是它没有返回它无法找到服务的原因。如果你确信电脑和服务名称都是正确的,那么我建议分析的下一件事是访问冲突问题。

而@ jsobo的回答可以是诊断的实际原因非常有用,因为它可以显示本地错误,而他们身边的.NET异常包装:

SC.EXE \ BOX2停止为MyService