我想使用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秒才能回来(请注意完全相同的错误),而不是我提供正确的机器名时几乎立即得到的响应。
我该如何调试此问题?
答案 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