0

我正在 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 作业的完成,以便我可以开始使用我下载的文件(作业将在脚本中的不同位置等待)
4

2 回答 2

1

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

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.1

https://docs.microsoft.com/en-us/sysinternals/downloads/psexec#:~:text=PsExec%20is%20a%20light-weight,to%20manually%20install%20client%20software

https://weblogs.asp.net/soever/returning-an-exit-code-from-a-powershell-script

于 2021-04-10T02:23:27.113 回答
0

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

与我最初的想法相反,Packer 的 PowerShell 配置程序允许您以任何用户的提升权限运行配置脚本......

  • elevated_userand elevated_password(string) - 如果指定,PowerShell 脚本将使用给定的 Windows 用户以提升的权限运行。
provisioner "powershell" {
   elevated_user = "Administrator"
   elevated_password = build.Password
}

...包括服务用户。

如果您指定一个空elevated_password值,则 PowerShell 脚本将作为服务帐户运行。例如:

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

在相应地调整了我的 Packer 模板的provisioner块之后,我现在可以确认Start-BitsTransfer并且朋友按预期工作。无需传递复杂的参数或在会话中玩花样。

于 2021-04-11T17:48:08.170 回答