Start-BitsTransfer在从powershell手动触发但不使用Windows服务时工作

我正在使用BITS将文件从一台Windows 2008 R2服务器传输到另一台。 当我从PowerShell或常规命令行手动运行命令它完美的作品。 现在,当我在Jenkins中使用相同的命令作为构build脚本的一部分时,它会失败,并显示以下错误:

Start-BitsTransfer:找不到path'\ 192.168.1.210 \ C $',因为它不存在。

Jenkins作为“本地系统”帐户下的Windows服务运行。 我以为改变Windows服务在“networking服务”帐户下运行可能会有所帮助,但事实并非如此。

是否有一些安全原因不允许BITS从Windows服务运行?

这里是我有deploy.ps1的Powershell脚本:

Function Get-PSCredential($User,$Password) { $SecPass = convertto-securestring -asplaintext -string $Password -force $Creds = new-object System.Management.Automation.PSCredential -argumentlist $User,$SecPass Return $Creds } $credential = Get-PSCredential -User jenkins -Password jenkins Import-Module BitsTransfer Start-BitsTransfer -source c:\file.zip -destination \\192.168.1.210\C$\Website -credential $credential 

再次确认,上面的PowerShell脚本工作得很好,当我手动触发它自己使用PowerShell或Windows命令。

这是我在Jenkins中用来触发脚本的命令:

 Powershell.exe -noprofile -executionpolicy Bypass -file C:\deploy.ps1 

可能不是你所希望的答案:

当您在非交互式上下文中运行的进程(如Windows服务)中使用* -BitsTransfer cmdlet时,可能无法将文件添加到BITS作业,这可能会导致挂起状态。 要继续进行作业,必须login用于创build传送作业的标识。 例如,在作为任务计划程序作业执行的PowerShell脚本中创buildBITS作业时,除非启用任务计划程序的任务设置“仅在用户login时运行”,否则BITS传输将永远不会完成。

从MSDN ,似乎这是不可能的…

请记住,“C $”份额是一个行政份额,即。 只有pipe​​理员可以看到和访问。 因此,除非运行Jenkins服务的服务帐户在192.168.1.210上具有本地pipe理权限,否则将会出现此错误 – 因为它实际上找不到指定的path。

尝试运行Jenkins服务作为目标服务器上具有本地pipe理员的域帐户作为testing,您应该看到行为更改。 那么你只需要确定你的Jenkins服务帐户需要什么权限。

或者,您可以尝试共享“网站”文件夹作为非pipe理共享,并查看networking服务是否可以访问该文件夹。 (然后您可能需要给源计算机NTFS访问文件夹)。

Bsaed事实上,它在错误消息中的单个反斜杠开始,它看起来像一个转义的问题。 PowerShell有一个烦人的习惯,把任何以反斜杠开始的东西当作正则expression式来处理。

尝试转义该参数。 想到三种可能的方法:

  1. 简单地逃避第一个反斜杠:

     `\\192.168.1.210\C$\Website 
  2. 单引号整个参数(不要双引号,因为$被双引号括起来):

     '\\192.168.1.210\C$\Website' 
  3. 加倍所有反斜杠:

     \\\\192.168.1.210\\C$\\Website 

正如Landonz回答的那样,起初不能这样做。 但是如果你愿意的话,那实际上是可以做到的。

请阅读: 服务帐户和BITS – “…您可以使用BITS从服务中传输文件,该服务必须使用LocalSystem,LocalService或NetworkService系统帐户,这些帐户始终是login的;因此,使用这些帐户的服务总是运行…“