次の方法で共有


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

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

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

アプリケーション (通常は 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 呼び出し内でアクセス チェックを実行する必要があります。それ以外の場合、ヘルパー トークンは転送ジョブにアクセスできない可能性があります。

手記

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

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

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

 

IBitsTokenOptions