我正在使用 BITS 将文件从一台 Windows 2008 R2 服务器传输到另一台。当我从 powershell 或常规命令行手动运行该命令时,它运行正常。现在,当我在 Jenkins 中使用相同的命令作为构建脚本的一部分时,它会失败并出现以下错误:
Start-BitsTransfer:找不到路径“\192.168.1.210\C$”,因为它不存在。
Jenkins 在“本地系统”帐户下作为 Windows 服务运行。我以为将 Windows 服务更改为在“网络服务”帐户下运行可能会有所帮助,但事实并非如此。
是否存在某些安全原因不允许 BITS 从 Windows 服务运行?
这是我的 Powershell 脚本部署.ps1:
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 或 windows 命令手动触发上述 powershell 脚本时,它可以完美运行。
这是我在 Jenkins 中用来触发脚本的命令:
Powershell.exe -noprofile -executionpolicy Bypass -file C:\deploy.ps1
答案1
可能不是你希望的答案:
当您在非交互式上下文中运行的进程(如 Windows 服务)中使用 *-BitsTransfer cmdlet 时,可能无法将文件添加到 BITS 作业,这可能会导致挂起状态。要继续执行作业,必须登录用于创建传输作业的身份。例如,在作为任务计划程序作业执行的 PowerShell 脚本中创建 BITS 作业时,除非启用任务计划程序的任务设置“仅在用户登录时运行”,否则 BITS 传输将永远无法完成。
从微软,这似乎是不可能的……
答案2
请记住,“C$”共享是管理共享,即仅管理员可见和可访问。因此,除非运行 Jenkins 服务的服务帐户在 192.168.1.210 上具有本地管理员权限,否则您将收到此错误 - 因为它实际上找不到指定的路径。
尝试以在目标服务器上具有本地管理员权限的域帐户运行 Jenkins 服务作为测试,您应该会看到行为发生变化。然后您只需要确定您的 Jenkins 服务帐户需要哪些权限。
或者,您可以尝试将“网站”文件夹作为非管理共享进行共享,并查看网络服务是否可以访问该文件夹。(然后您可能需要授予源计算机帐户对该文件夹的 NTFS 访问权限)。
答案3
因为它以单个反斜杠开头错误信息,这看起来像是一个转义问题。PowerShell 有一个令人讨厌的习惯,就是将以反斜杠开头的所有内容\
视为正则表达式。
尝试转义该参数。我想到三种可能的方法:
只需转义第一个反斜杠:
`\\192.168.1.210\C$\Website
用单引号括住整个参数(不要用双引号括住它,因为
$
在双引号中的项目中会特殊处理):'\\192.168.1.210\C$\Website'
将所有反斜杠加倍:
\\\\192.168.1.210\\C$\\Website
答案4
正如 landonz 所回答的,一开始,这是不可能的。但实际上这是可以做到的,只要你愿意付出努力。
读这个:服务帐户和 BITS- “... 您可以使用 BITS 从服务传输文件。该服务必须使用 LocalSystem、LocalService 或 NetworkService 系统帐户。这些帐户始终处于登录状态;因此,使用这些帐户提交的服务的作业始终运行。...”