BITS 転送ジョブのヘルパー トークン

Windows Vista では、バックグラウンド インテリジェント転送サービス (BITS) サービスにより、アプリケーションは 1 つのセキュリティ トークンを BITS 転送ジョブに関連付けることができます。 その後、BITS 転送ジョブは、このトークンを認証に使用し、ローカル リソースとリモート リソースにアクセスするために使用します。

Windows 7 では、BITS サービスは BITS 転送ジョブに追加のトークンを関連付けます。 BITS 転送ジョブは、BITS COM API を呼び出すアプリケーションによって作成される偽装トークンである追加のセキュリティ トークンを使用して構成できます。 このヘルパー トークン モデルにより、アプリケーションは 2 つの異なるセキュリティ トークンを同時に使用して、ローカル ファイル、クライアント側の証明書、リモート ファイル、およびプロキシにアクセスできます。 たとえば、ダウンロードされたデータを特権のあるローカル ディレクトリに書き込む BITS 転送ジョブが作成され、権限の低いドメイン ID が HTTP サーバーとプロキシ サーバーに提示されます。

アプリケーション (通常は Windows サービス) は、新しいインターフェイス IBitsTokenOptions を使用してヘルパー トークンを指定します。 このインターフェイスは、BITS ジョブ オブジェクトによって実装されます。 アプリケーションは IBackgroundCopyJob::QueryInterface を呼び出してインターフェイス ポインターを取得します。 アプリケーションはヘルパー ID を偽装し、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 呼び出し内で実行する必要があります。それ以外の場合、ヘルパー トークンは転送ジョブにアクセスできない可能性があります。

Note

以前の実装では、ヘルパー トークンを設定するために BITS ユーザーに管理者特権が必要でした。 Windows 10 バージョン 1607 以降では、管理者以外の BITS ユーザーは IBitsTokenOptions::SetHelperToken を使用して、所有する BITS ジョブに管理者以外のヘルパー トークンを設定できます。 この変更により、管理者以外の BITS ユーザー (NetworkService アカウントで実行されているバックグラウンド ダウンローダー サービスなど) がヘルパー トークンを設定できるようになります。

具体的には、次の条件が満たされている限り、管理者権限を持たないユーザーでもヘルパー トークンを設定できるように実装が変更されました。

  • IBackgroundCopyJob::QueryInterface 呼び出し中、呼び出し元のスレッドのトークンの SID は、ジョブ所有者のユーザー アカウントの SID と同じです。
  • IBitsTokenOptions::SetHelperToken が呼び出されると、ヘルパー トークンで管理者 SID (DOMAIN_ALIAS_RID_ADMINS) は有効になっていません。

 

IBitsTokenOptions