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

尝试通过Powershell/MSBuild远程停止时找不到服务,powershell,service,msbuild,continuous-integration,topshelf,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)'=='Releas

作为持续集成构建过程的一部分,我的任务是将使用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>
Get-Service : Cannot find any service with service name 'MyServiceName' (TaskId:198)
问题

当我在TFS中对新构建排队时,脚本确实成功执行;但是,
getservice
命令无法找到有问题的服务,尽管它确实存在并且正在运行。生成日志中的特定错误如下所示:

<?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>
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远程启动和停止服务,但遇到了类似的问题

我复习的一些问题

我在这个问题上花费的时间超出了我的实际承受能力,因此,如果您能提供帮助/指导/意见,我将不胜感激

谢谢大家!

更新

正如日志显示的Powershell输出,我能够确认Powershell脚本正在从MSBuild任务接收信息

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


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

看来没有任何东西从MSBuild目标文件传递到powershell脚本。您正在通过“标记”定义所涉及的服务的名称,因此它将采用该名称,而不是MSBuild目标文件正在执行的操作


我建议您找出如何传递此变量,否则脚本将无法正确拾取此变量。

我正在暗中摸索,但您的服务名称需要TopShelf实例名称,包括您调用get service时的名称


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

我不确定它是否有帮助,但我会从初始诊断开始-启动不带名称参数的get service(仅限ComputerName)并确保(使用手动检查)此命令确实到达了您的服务器,并且没有在本地执行。请尝试使用或
gwmi win32\u service-credential
。非常感谢您的评论。今天晚些时候我将再次讨论这个问题,并就结果提出建议。MSBuild目标文件肯定正在向Powershell传递参数。我能够确认这一点,因为完整的命令在日志文件中可见。然而,我没有时间去看这个。非常感谢你的评论。