BITS 传输作业的帮助程序令牌
在 Windows Vista 中,后台智能传输服务 (BITS) 服务允许应用程序将单个安全令牌与 BITS 传输作业相关联。 然后,BITS 传输作业使用此令牌进行身份验证,并访问本地和远程资源。
在 Windows 7 中,BITS 服务将附加令牌与 BITS 传输作业相关联。 可以用一个额外的安全令牌配置 BITS 传输作业,这是一个由调用 BITS COM API 的应用程序创建的模拟令牌。 此帮助程序令牌模型允许应用程序同时使用两个不同的安全令牌来访问本地文件、客户端证书、远程文件和代理。 例如,创建 BITS 传输作业,将下载的数据写入特权本地目录,然后向 HTTP 服务器和代理服务器提供低权限域标识。
应用程序(通常是 Windows 服务)使用新的接口 IBitsTokenOptions 指定帮助程序令牌。 此接口由 BITS 作业对象实现。 应用程序调用 IBackgroundCopyJob::QueryInterface 以获取接口指针。 应用程序模拟帮助程序标识,并调用 IBitsTokenOptions::SetHelperToken 将令牌传递给 BITS 服务。 然后,应用程序通过使用 IBitsTokenOptions::SetHelperTokenFlags 传递一组位标志来指定应用令牌的资源。 应用程序清除所有标志(再次使用 SetHelperTokenFlags)以还原行为。 BITS 服务将位标志和令牌存储在 BITS 传输作业中。
BITS 传输作业的所有者注销时,BITS 服务将丢弃与传输作业关联的任何帮助程序令牌。 如果传输未完成,BITS 服务会将作业置于错误状态,错误代码为 BG_E_TOKEN_REQUIRED,并丢弃帮助程序令牌。 客户端应用程序可以通过调用 IBitsTokenOptions::SetHelperToken 来刷新令牌,然后可以恢复 BITS 传输作业。 或者,客户端应用程序可以使用 IBitsTokenOptions::SetHelperTokenFlags 清除帮助程序令牌标志,然后在没有帮助程序令牌的情况下恢复传输作业。
同样,当终端服务会话的所有者注销时,BITS 服务必须丢弃该会话中的任何帮助程序令牌,并将受影响的传输作业置于错误状态,并显示 BG_E_TOKEN_REQUIRED 错误代码。
帮助程序令牌模型需要更改 BITS 访问控制策略。 BITS 的早期版本对每个方法调用都实现了访问检查。 从 Windows 7 开始,必须在 IBackgroundCopyJob::QueryInterface 调用中执行访问检查;否则,帮助程序令牌可能无权访问传输作业。
注意
旧实现实际上要求 BITS 用户具有管理员权限才能设置帮助程序令牌。 从 Windows 10 版本 1607 开始,非管理员 BITS 用户可以使用 IBitsTokenOptions::SetHelperToken 在自己拥有的 BITS 作业上设置非管理员帮助程序令牌。 此更改使非管理员 BITS 用户(例如,在 NetworkService 帐户下运行的后台下载程序服务)能够设置帮助程序令牌。
具体而言,该实现已更改为允许没有管理员权限的用户设置帮助程序令牌,只要满足以下条件:
- 在 IBackgroundCopyJob::QueryInterface 调用期间,调用方线程令牌的 SID 与作业所有者用户帐户的 SID 相同,并且
- 调用 IBitsTokenOptions::SetHelperToken 时,帮助程序令牌未启用管理员 SID (DOMAIN_ALIAS_RID_ADMINS)。
相关主题