BITS を使用する際のベスト プラクティス

このセクションには、BITS を使用するアプリケーションを設計するときに考慮する必要がある情報が含まれています。

ユーザー コンテキストまたはサービス コンテキスト

BITS は、ジョブの所有者がコンピューターにログオンしている場合にのみファイルを転送します (ユーザーは対話的にログオンしている必要があります)。 BITS は RunAs コマンドをサポートしていません。 詳細については、「ユーザーとネットワーク接続」を参照してください。

アプリケーションにユーザーのコンテキストが必要ない場合は、代わりに LocalSystem、LocalService、または NetworkService として実行されるサービスを作成することを検討してください。 これらのシステム アカウントは常にログオンしているため、転送はユーザーがログオフする必要はありません。 ただし、ジョブの作成時にユーザーを偽装する場合は、対話型ログオン ルールが適用されます。 詳しくは、「サービス アカウントと BITS」をご覧ください。

ジョブは永続的です

IBackgroundCopyJob::Complete メソッドまたは IBackgroundCopyJob::Cancel メソッドを呼び出すまで、ジョブはキューに残ります。 ジョブ内のファイルは、Complete を呼び出すまでユーザーが使用できません。 通常は、ジョブの状態が BG_JOB_STATE_TRANSFERRED であるときに Complete を呼び出し、ジョブが BG_JOB_STATE_TRANSIENT_ERROR 状態または BG_JOB_STATE_ERROR 状態にあり、進行できなくなった場合はCancel を呼び出します。

Complete メソッドまたは Cancel メソッドを 90 日以内に呼び出さない場合 (既定の JobInactivityTimeout グループ ポリシー)、サービスはジョブを取り消します。 ジョブをクリーンアップするには、常に Complete メソッドまたは Cancel メソッドを呼び出して、JobInactivityTimeout ポリシーに依存しないようにする必要があります。 MaxJobsPerUser または MaxJobsPerMachine ポリシーの制限に達すると、キューにジョブが残っているため、ユーザーは他のジョブを作成できなくなる可能性があります。

フォアグラウンドまたはバックグラウンドの優先度を使用する場合

ジョブがタイム クリティカルであるか、ユーザーが積極的に待機している場合を除き、常にバックグラウンド優先度を使用する必要があります。 ただし、プロキシまたはサーバーが Content-Range ヘッダーをサポートしていない場合や、クライアント上のウイルス対策ソフトウェアが範囲ヘッダー要求を削除している場合など、バックグラウンド優先度からフォアグラウンド優先度に切り替えたい場合があります。 フォアグラウンド優先への切り替えは、ファイル サイズが 2 GB 未満のファイルに対してのみ機能します。 例については、IBackgroundCopyCallback::JobError メソッドの実装を参照してください。 また、ネットワークの切断やユーザーのログオフによりフォアグラウンド ジョブが中断された場合、BITS は範囲要求を送信して中断したところから転送を再開しようとするため、ジョブは失敗することにも注意してください。

Windows 8 以降では、BITS ダウンロードの HTTP 要件を満たしていないサーバーを対象とする場合は、BITS_JOB_PROPERTY_DYNAMIC_CONTENTBG_JOB_PRIORITY_FOREGROUND でジョブのダウンロードを構成する必要があります。 これにより、(接続の問題やシステムの再起動などにより) ダウンロードが中断された場合、BITS はダウンロードを最初からやり直す必要があることに注意してください。

使用可能な優先順位と、BITS が優先順位レベルを使用してジョブをスケジュールする方法については、「BG_JOB_PRIORITY」を参照してください。

一時的なエラーと致命的なエラー

一部のエラーは回復可能であり、一部は回復できません。 たとえば、「サーバーが利用できません」というエラーは回復可能なエラーであり、「アクセスが拒否されました」というエラーは致命的なエラーです。 BITS は、回復可能なエラーを一時的なエラー状態にし、指定された間隔の後にジョブを再試行します。 ジョブが進行できない場合、BITS はジョブを致命的なエラー状態に移動します。 IBackgroundCopyJob::SetMinimumRetryDelay メソッドと IBackgroundCopyJob::SetNoProgressTimeout メソッドを使用して、BITS が一時的なエラーを処理する方法を制御します。

フォアグラウンド ジョブの場合は、ジョブが一時的なエラー状態に留まる時間を制限し、回復を試みる必要があります。 SetNoProgressTimeout メソッドを使用して、ジョブが一時的なエラー状態に留まる時間を制限したり、ジョブを致命的なエラー状態に強制したりします。 ジョブの回復を試みる場合は、SetMinimumRetryDelay メソッドを使用して最小再試行遅延を 60 秒に設定するか、IBackgroundCopyJob::Resume メソッドを呼び出してジョブを再度アクティブ化する必要があります。

詳細については、「BG_JOB_STATEBITS ジョブのライフ サイクル、および エラーの処理」を参照してください。

ネットワーク帯域幅の使用状況の測定

BITS は、クライアントのネットワーク アダプターを使用して、利用可能なネットワーク帯域幅を推定する場合があります。 BITS はクライアントを超える帯域幅を測定できないため、WAN リンクが混雑する可能性があります。 WAN リンクの輻輳を減らすために、MaxInternetBandwidth グループ ポリシーを使用して、クライアントが使用する帯域幅の量を制限できます。 詳細については、「ネットワーク帯域幅グループ ポリシー」を参照してください。

多くのクライアントが特定のサーバーからファイルをダウンロードするために使用するアプリケーションを作成している場合は、サーバーにリクエストで過負荷がかからないよう、ダウンロード リクエストをずらすスキームを検討する必要があります。

プロキシおよびサーバー認証の資格情報の設定

プロキシまたはサーバーがユーザーの資格情報を必要とする場合は、資格情報を BITS に提供する必要があります。 資格情報を指定するには、IBackgroundCopyJob2::SetCredentials メソッドを呼び出します。 BITS では、Basic、Digest、Negotiate、NTLM、Passport の認証スキームがサポートされています。

認証の詳細については、「認証」を参照してください。

ユーザー アカウントとサービス アカウントのプロキシ設定の指定

既定では、BITS はユーザーのインターネット エクスプローラー プロキシ設定を使用します。 ユーザーのインターネット エクスプローラー プロキシ設定をオーバーライドするには、IBackgroundCopyJob::SetProxySettings メソッドを呼び出します。

インターネット エクスプローラー プロキシ設定はシステム アカウントには適用されないため、既定のプロキシ動作 (BG_JOB_PROXY_USAGE_PRECONFIG) は、追加の構成手順を実行しない限り、Web プロキシ自動検出プロトコル (WPAD) の展開でのみ正しく機能します。 アプリケーションが LocalSystem、LocalService、または NetworkService として実行されているサービスの場合は、BITS ジョブでヘルパー トークンを構成するか、BG_JOB_PROXY_USAGE_OVERRIDEIBackgroundCopyJob::SetProxySettings を呼び出して、適切なプロキシ設定を明示的に設定することを検討してください。 代わりに、/Util /SetIEProxy スイッチの BitsAdmin.exe を使用して、LocalSystem、LocalService、または NetworkService システム アカウントのインターネット エクスプローラー プロキシ設定を設定できます。 詳細については、「BitsAdmin ツール」を参照してください。

BITS は、Proxycfg.exe ファイルを使用して設定されたプロキシ設定を認識しません。

Windows 10 October 2018 Update (10.0; Build 17763) 以降、BITS は WinHttp が AUTOMATIC_PROXY で使用するものと同じプロキシ順序を使用します。 BG_JOB_PROXY_USAGE_PRECONFIG が指定されている場合、BITS はこのより互換性の高い順序を使用します。 BG_JOB_PROXY_USAGE_PRECONFIG は、HTTP プロキシを指定するための既定値です。

プロキシを認証するためのユーザー固有の設定の指定

マシンのネットワーク ドメインで使用可能な NTLM または Kerberos 資格情報を持たないアカウントとして実行中に、プロキシ認証が必要な環境で BITS を使用している場合は、資格情報を持つ別のユーザー アカウントの資格情報を使用して、適切に認証するための追加の手順をドメインで実行する必要があります。 これは、BITS コードが LocalService、NetworkService、LocalSystem などのシステム サービスとして実行されている場合の一般的なシナリオです。これらのアカウントには使用可能な NTLM または Kerberos 資格情報がないためです。

このシナリオでの認証のしくみの詳細については、「認証」を参照してください。

スケーラビリティ

キュー内に 100 を超えるジョブがある場合、ジョブの構成によってはパフォーマンスが低下し始める可能性があります。 BITS では、MaxJobsPerMachine ポリシー設定を使用して、キュー内のジョブの数にハード制限を適用します。 複数の応募が 100 件の求人ガイドラインを超える可能性が低くなるように、応募は求人数を約 10 件に制限する必要があります。 通常、送信するジョブが多数あるアプリケーションでは、最初に 10 個のジョブが送信され、各ジョブが終了するたびに 1 つずつ送信されます。

ジョブ内のファイル数も最大 10 ファイルに制限する必要があります。 ジョブで大量のファイルを転送する場合は、代わりにすべてのファイルを含む CAB ファイルを作成することを検討してください。

HTTP ヘッダーは、いずれの場合でも使用できます

HTTP 標準では、HTTP ヘッダーは大文字と小文字を区別せずに扱う必要があると常に規定されています (RFC 7230 セクション 3.2)。 最新の HTTP 標準である RFC 7540 ではさらに進んで、HTTP/2 トラフィックは大文字と小文字を区別せずにヘッダーを比較し、ヘッダーを小文字で表示する必要があると規定しています (RFC 6540、セクション 8.1.2)。 トラフィックが小文字以外のヘッダーで送信される場合でも、プロキシはヘッダーを強制的に小文字にすることを選択する可能性があります。

個人を特定できる情報 (PII) の回避

ジョブの表示名、説明、ファイル名を含む BITS ジョブは、管理者権限を持つすべてのユーザーに表示されます。 Windows テレメトリに追加することもできます。 機密データ (ユーザー自身の名前など) をジョブの詳細に含めることは避けてください。