MSBuild的。检查是否已安装Windows服务

时间:2011-02-16 23:30:54

标签: deployment msbuild windows-services remote-server

我是msbuild的新手,目前我正在尝试创建将我的C#windows服务部署到远程测试服务器的msbuild脚本。

我正在考虑将sc.exe实用程序用于此目的。阅读它我没有找到一种方法来检查Windows服务是否安装在远程服务器上。如果安装了该服务,那么我需要停止它并更新必要的文件,否则我需要注册该服务。

P.S。对于发布版本,我计划使用WiX创建MSI包。

2 个答案:

答案 0 :(得分:9)

您需要MSBuild Comminity Tasks。 在最新版本中,存在 MSBuild.Community.Tasks.v1.2.0.306 \ Source \ Services.proj 中的示例。 它将解决您问题的第一部分:

    

<PropertyGroup>
    <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\bin\Debug</MSBuildCommunityTasksPath>
</PropertyGroup>

<Import Project="$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\MSBuild.Community.Tasks.Targets"/>

<Target Name="Test">
    <CallTarget Targets="DoesServiceExist" />
    <CallTarget Targets="GetServiceStatus" />
    <CallTarget Targets="ServiceControllerStuff" />
</Target>

<Target Name="DoesServiceExist">
    <ServiceQuery ServiceName="MSSQLServer123" MachineName="127.0.0.1" >
        <Output TaskParameter="Exists" PropertyName="Exists" />
        <Output TaskParameter="Status" PropertyName="ServiceStatus" />
    </ServiceQuery>
    <Message Text="MSSQLServer Service Exists: $(Exists) - Status: $(ServiceStatus)"/>
</Target>

<Target Name="GetServiceStatus">
    <ServiceQuery ServiceName="MSSQLServer" MachineName="127.0.0.1">
        <Output TaskParameter="Status" PropertyName="ResultStatus" />
    </ServiceQuery>
    <Message Text="MSSQLServer Service Status: $(ResultStatus)"/>
</Target>

<Target Name="ServiceControllerStuff">
    <ServiceController ServiceName="aspnet_state" MachineName="127.0.0.1" Action="Start" />
    <ServiceController ServiceName="aspnet_state" MachineName="127.0.0.1" Action="Stop" />
</Target>

那些MSBuild任务只是.Net class ServiceController的包装。查看文档以了解其工作原理以及如何详细配置它。

第二部分包括安装服务。为此,sc.exe适合very well

答案 1 :(得分:0)

发布完整的解决方案here。可以帮助未来的访客。

更新:在其他博客服务停止时更新了链接。