我正在 PowerShell 中为 CI 管道上的 Packer 构建的 Windows 映像编写配置脚本。此过程涉及下载几个大文件。我的印象是BITS比 快Invoke-WebRequest
,所以我决定使用 BITS 来异步下载这些大文件。
问题是 BITS只会为交互式登录的用户处理作业......
BITS 仅在作业的所有者登录到计算机时传输文件(用户必须以交互方式登录)。BITS 不支持RunAs命令。
...除非作业是由服务帐户提交的。
您可以使用 BITS 从服务传输文件。该服务必须使用 LocalSystem、LocalService 或 NetworkService 系统帐户。这些帐户始终处于登录状态;因此,使用这些帐户的服务提交的作业始终运行。
但即便如此,也有一个皱纹:
如果在系统帐户下运行的服务在调用 BITS 之前模拟用户,则 BITS 会像对任何用户帐户一样做出响应(例如,用户需要登录到计算机才能进行传输)。
这是一个问题,因为供应脚本作为管理员帐户运行,该帐户不是服务帐户,因此必须以交互方式登录才能使用 BITS。这恰好是Packer的行为,所以我无法改变这一点。 我错了,我可以改变这个。看我的最终答案。 如何在一个 PowerShell 脚本中执行以下操作?
Administrator
使用服务帐户的凭据提交 BITS 作业。我假设我需要将一些东西传递给Start-BitsTransfer
's-Credential
参数?- 将 BITS 作业存储在局部变量中(作业将在脚本中的不同位置启动)
- 等待 BITS 作业的完成,以便我可以开始使用我下载的文件(作业将在脚本中的不同位置等待)