尝试通过Powershell / MSBuild远程停止时找不到服务

时间:2014-03-14 10:13:33

标签: powershell service msbuild continuous-integration topshelf

我有一项任务是将使用Topshelf创建的两个Windows服务部署到测试服务器,作为我们持续集成构建过程的一部分。

我的MSBuild目标文件如下:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Condition="'$(ConfigurationName)'=='Release'" Name="StopService">
    <Exec Command="powershell.exe -NonInteractive -executionpolicy Unrestricted -command &quot;&amp; { &amp;&apos;.\ServiceStop.ps1&apos; } &quot;" ContinueOnError="true" />
  </Target>

</Project>

这将执行位于项目内名为ServiceStop.ps的同一文件夹中的Powershell脚本(以及几行):

$service = get-service -ComputerName MyServerName -Name 'MyServiceName'

stop-service -InputObject $service -Verbose

问题

当我从TFS中排队新的构建时,脚本会成功执行;但是,get-service命令无法找到有问题的服务 - 尽管它肯定存在且正在运行。构建日志中的特定错误如下:

Get-Service : Cannot find any service with service name 'MyServiceName' (TaskId:198)

当脚本从我的机器本地运行时,远程机器上的服务被找到并成功停止,这让我觉得它是某种权限问题。

我尝试了什么

我对Powershell的经验非常有限。我读到凭证可以存储在Powershell对象中,如下所示:

$pw = Read-Host -AsSecureString "Enter password"
$pw | ConvertFrom-SecureString | Out-File -Path .\storedPassword.txt

$password = get-content .\storedPassword.txt | convertto-securestring
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist "myAdminAccountName",$password

但是,get-service似乎没有任何方法可以将凭据传递给它。

我还尝试使用PSExec远程启动和停止服务,但遇到了类似的问题。

我审核的一些问题

Using PowerShell credentials without being prompted for a password

Powershell stop-service error: cannot find any service with service name

Powershell Get-WmiObject Access is denied

Saving credentials for reuse by powershell and error ConvertTo-SecureString : Key not valid for use in specified state

我花在这个问题上的时间比我真正负担得多,所以我们将不胜感激任何有用的帮助/指导/意见。

谢谢!

更新

我能够确认Powershell脚本是从MSBuild任务接收信息,因为日志显示了Powershell输出。

但是,我没有时间找到解决方案,而是通过将更新的服务二进制文件放到目标服务器上并编写一个从那里安装它们的Powershell脚本来解决这个问题。

非常感谢那些对此问题发表评论的人。

2 个答案:

答案 0 :(得分:0)

似乎没有任何内容从MSBuild目标文件传递到powershell脚本。您正在通过'标记来定义所涉及的服务的名称,因此它取决于MSBuild目标文件正在执行的操作。

我建议你找出如何传递这个变量,否则脚本将无法正确选择它。

答案 1 :(得分:0)

我在黑暗中完成了一次完整的攻击,但是您的服务名称需要 TopShelf 实例名称,包括当您调用get-service时。

例如,您的服务可能被称为“MyWindowsService”,但您需要以编程方式查找“MyWindowsService $ default”