服务帐户和 BITS

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

如果在系统帐户下运行的服务在调用 BITS 之前模拟用户,BITS 会像对任何用户帐户一样进行响应(例如,用户需要登录到计算机才能进行传输)。 在模拟用户时,服务还会使用带有 BITS 接口指针的动态掩蔽。 掩蔽不继承,因此必须在从 BITS 接收的每个接口指针上调用 CoSetProxyBlanket 函数(例如,调用 IBackgroundCopyManager::CreateJob 方法返回的作业指针);仅仅在管理器接口指针上设置掩蔽是不够的。 还可以为进程调用 CoInitializeSecurity 函数,而不是在每个接口指针上调用 CoSetProxyBlanket 函数。

但是,如果服务不模拟用户,则会应用以下行为:

  • 服务帐户创建的作业归该帐户所有。 由于系统帐户始终处于登录状态,因此只要计算机正在运行并且存在网络连接,BITS 即可传输文件。
  • 系统帐户不应使用映射的网络驱动器号,因为驱动器号特定于会话,并且在计算机重新启动后映射可能会丢失。
  • 在没有帮助程序令牌的情况下,网络身份验证将使用 LocalSystem 和 NetworkService 帐户的计算机凭据以及 LocalService 帐户的匿名凭据。 如果源文件的访问控制列表 (ACL) 限制对用户帐户的访问,则 BITS 将返回“访问被拒绝”。
  • 有关身份验证在帮助程序令牌存在的情况下的工作原理的详细信息,请参阅身份验证
  • Microsoft Internet Explorer 代理设置是按用户存储的,而不是为系统帐户设置的。 请考虑在 BITS 作业上配置帮助程序令牌,或使用 BG_JOB_PROXY_USAGE_OVERRIDE 调用 IBackgroundCopyJob::SetProxySettings 显式设置正确的代理设置。 或者,可以使用 BitsAdmin.exe 的 /Util /SetIEProxy 开关为 LocalSystem、LocalService 或 NetworkService 系统帐户设置 Internet Explorer 代理设置。 有关详细信息,请参阅 BitsAdmin 工具

请注意,BITS 无法识别使用 Proxycfg.exe 文件设置的代理设置。