Windows 如何使用打包机供应器中的BITS下载文件?

Windows 如何使用打包机供应器中的BITS下载文件?,windows,powershell,windows-services,packer,microsoft-bits,Windows,Powershell,Windows Services,Packer,Microsoft Bits,我正在PowerShell中为CI管道上的Packer构建的Windows映像编写一个配置脚本。这个过程包括下载几个大文件。我的印象是速度比,所以我决定使用BITS异步下载这些大文件 问题是比特 BITS仅在作业所有者登录到计算机时传输文件(用户必须以交互方式登录)。BITS不支持运行方式命令 您可以使用BITS从服务传输文件。服务必须使用LocalSystem、LocalService或NetworkService系统帐户。这些帐户总是登录的;因此,由使用这些帐户的服务提交的作业始终运行 但

我正在PowerShell中为CI管道上的Packer构建的Windows映像编写一个配置脚本。这个过程包括下载几个大文件。我的印象是速度比,所以我决定使用BITS异步下载这些大文件

问题是比特

BITS仅在作业所有者登录到计算机时传输文件(用户必须以交互方式登录)。BITS不支持运行方式命令

您可以使用BITS从服务传输文件。服务必须使用LocalSystem、LocalService或NetworkService系统帐户。这些帐户总是登录的;因此,由使用这些帐户的服务提交的作业始终运行

但即便如此,还是有一条皱纹:

如果在系统帐户下运行的服务在调用BITS之前模拟用户,BITS会像对任何用户帐户一样响应(例如,用户需要登录到计算机才能进行传输)

这是一个问题,因为设置脚本作为管理员帐户运行,管理员帐户不是服务帐户,因此必须以交互方式登录才能使用BITS。这是帕克的行为,所以我不能改变。我错了,我可以改变这个。看我最后的答案如何在一个PowerShell脚本中执行以下操作?

  • 使用服务帐户的凭据以管理员身份提交BITS作业。我假设我需要向的
    -Credential
    参数传递一些信息
  • 将BITS作业存储在局部变量中(作业将在脚本中的不同位置启动)
  • 等待BITS作业完成,以便我可以开始使用我下载的文件(作业将在脚本中的不同位置等待)

您可以使用psexec运行具有管理员内容系统权限的辅助脚本,并让主脚本标识psexec进程的退出代码,以确认它已成功执行


事实证明有一个解决方案,尽管它是针对Packer的。我没有多提我对它的使用,因为我认为它没有那么重要

与我最初的想法相反,Packer的PowerShell供应器

  • 提升的\u用户
    提升的\u密码
    (字符串)-如果指定,PowerShell脚本将使用给定的Windows用户以提升的权限运行
…包括服务用户

如果指定空的
u密码
值,则PowerShell脚本将作为服务帐户运行。例如:

provisioner "powershell" {
  elevated_user = "SYSTEM"
  elevated_password = ""
}

在相应地调整了我的打包器模板的
provisioner
块之后,我现在可以确认和朋友们按照预期工作。无需传递复杂的参数或在会话中耍花招。

我认为您可能在理解“服务帐户”这个模棱两可的术语此处-文档讨论的是配置为使用本地系统帐户登录的Windows服务的安全上下文-没有可传递的凭据可传递给
启动位传输-凭据,您需要将整个脚本封装在实际的Windows服务中-这不可能在单个独立脚本中完成(至少没有很多代码和/或环境副作用)。谢谢,我将尝试一下它是否有效。等等,实际上,该解决方案如何不与此相冲突:如果在系统帐户下运行的服务在调用BITS之前模拟用户,BITS的响应与任何用户帐户一样(例如,用户需要登录到计算机才能进行传输)
provisioner "powershell" {
  elevated_user = "SYSTEM"
  elevated_password = ""
}