IBackgroundCopyJob2
COM公式ドキュメント
アップロード応答ジョブから応答データを取得し、クライアントへの応答データ転送の進行状況を確認し、コマンドラインの実行を要求し、プロキシおよびリモートサーバーの認証要求に対する資格情報を提供します。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ジョブが BG_JOB_STATE_ERROR または BG_JOB_STATE_TRANSFERRED 状態になったときに実行するプログラムを指定します。BITS は、このメソッドを呼び出したユーザーのコンテキストでプログラムを実行します。
| Program | LPWSTR | in | 実行するプログラムを含む null 終端文字列。pProgram パラメーターは、null 終端文字を含めずに MAX_PATH 文字までに制限されます。プログラムへのフルパスを指定してください。このメソッドは、プログラムを探すために検索パスを使用しません。 コマンドライン通知を削除するには、pProgram と pParameters を NULL に設定します。pProgram が NULL で pParameters が NULL 以外の場合、このメソッドは失敗します。 |
| Parameters | LPWSTR | in | pProgram で指定したプログラムのパラメーターを含む null 終端文字列。最初のパラメーターは pProgram のプログラムでなければなりません (パスに長いファイル名を使用する場合は引用符で囲みます)。pParameters パラメーターは、null 終端文字を含めずに 4,000 文字までに制限されます。このパラメーターは NULL にできます。 |
戻り値
このメソッドは、以下の HRESULT 値のほか、その他の値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| ジョブの状態を BG_JOB_STATE_CANCELLED または BG_JOB_STATE_ACKNOWLEDGED にすることはできません。 | |
| pProgram または pParameters の文字列が長すぎます。 |
解説(Remarks)
BITS は、プログラムを起動するために CreateProcessAsUser 関数を呼び出します。
プログラムは終了コード 0 を返すようにしてください。プログラムが終了コード 0 を返さない場合、BITS はジョブの状態を確認します。プログラムがジョブをキャンセルも完了もしなかった場合、BITS はそのジョブに指定された 最小再試行遅延 が経過した後にプログラムを再度呼び出します。
BITS 1.5 以前: BITS はプログラムを 1 回だけ呼び出します。
スクリプトを実行するには、pProgram に WScript.exe を指定します (WScript.exe のフルパスを含めます)。pParameters パラメーターには、WScript.exe、スクリプト名、および任意の引数を含める必要があります。
プログラムがジョブ関連の情報を必要とする場合は、その情報を引数として渡す必要があります。%system32% などの環境変数は展開されないため、pProgram や pParameters に含めないでください。
プログラムへのフルパスを含める必要があります。pParameters の引数のいずれか (モジュール名など) に長いファイル名を使用するパスが含まれる場合は、そのパスを引用符で囲んでください。
実行するプログラムが応答ファイルまたはダウンロードファイルを使用する場合、そのプログラムは IBackgroundCopyJob::Complete メソッドを呼び出して、ファイルをクライアントから利用できるようにする必要があります。
プログラムを実行するタイミングを指定するには、 IBackgroundCopyJob::SetNotifyFlags メソッドを呼び出します。コマンドラインの実行を要求できるのはジョブのエラーイベントまたは転送完了イベントに対してのみで、ジョブ変更イベントに対しては要求できません。イベントの発生後に SetNotifyCmdLine メソッドを呼び出した場合でも、BITS はコマンドラインを実行することに注意してください。
BITS ジョブがサービスアカウントのコンテキスト (networkservice/localsystem/localservice) にある場合、いかなる形式のコマンドラインコールバックも実行されません。
SetNotifyCmdLine メソッドと IBackgroundCopyJob::SetNotifyInterface メソッドの両方を呼び出した場合、BITS は通知インターフェイスが無効になったとき、または BITS が呼び出した通知メソッドが失敗コードを返した場合にのみコマンドラインを実行します。たとえば、BITS が呼び出した通知メソッドが E_FAIL を返した場合、BITS はコマンドラインを実行します。ただし、通知メソッドが S_OK を返した場合、BITS はコマンドラインを実行しません。通知メソッドとコマンドラインの実行要求の両方が失敗した場合、BITS は最小再試行期間の経過後に再度通知を送信します。
IBackgroundCopyJob::TakeOwnership メソッドを呼び出すと、ジョブからコマンドライン通知が削除されることに注意してください。
例
SetNotifyCmdLine メソッドを呼び出す例については、 Registering to Execute a Program を参照してください。
ジョブがエラー状態または転送完了状態になったときに実行するプログラムを取得します。
| pProgram | LPWSTR* | out | ジョブがエラー状態または転送完了状態になったときに実行するプログラムを含む null 終端文字列。使用後は CoTaskMemFree 関数を呼び出して pProgram を解放してください。 |
| pParameters | LPWSTR* | out | pProgram のプログラムの引数を含む null 終端文字列。使用後は CoTaskMemFree 関数を呼び出して pParameters を解放してください。 |
戻り値
このメソッドは、成功時に S_OK を返し、エラー時には標準的な COM の HRESULT 値のいずれかを返します。
解説(Remarks)
IBackgroundCopyJob2::SetNotifyCmdLine メソッドが呼び出されていない場合、 GetNotifyCmdLine メソッドは pProgram と pParameters を空の文字列 (L"") に設定します。
アップロード応答ジョブからの応答データの転送に関する進行状況情報を取得します。
| pProgress | BG_JOB_REPLY_PROGRESS* | inout | 応答ファイルの転送の完了率を計算するために使用する情報を格納します。詳細については、 BG_JOB_REPLY_PROGRESS を参照してください。 |
戻り値
このメソッドは、以下の HRESULT 値のほか、その他の値を返します。
| 戻り値 | 説明 |
|---|---|
| 進行状況情報を正常に取得しました。 | |
| このメソッドは、BG_JOB_TYPE_DOWNLOAD 型または BG_JOB_TYPE_UPLOAD 型のジョブでは実装されていません。 | |
| pProgress パラメーターを NULL にすることはできません。 |
サーバーアプリケーションからの応答データのメモリ内コピーを取得します。このメソッドは、ジョブの種類が BG_JOB_TYPE_UPLOAD_REPLY で、状態が BG_JOB_STATE_TRANSFERRED である場合にのみ呼び出してください。
| ppBuffer | BYTE** | out | 応答データを格納するバッファー。サーバーアプリケーションが応答を返さなかった場合、このメソッドは ppBuffer を NULL に設定します。使用後は CoTaskMemFree 関数を呼び出して ppBuffer を解放してください。 |
| pLength | ULONGLONG* | inout | ppBuffer 内の応答データのサイズ (バイト単位)。 |
戻り値
このメソッドは、以下の HRESULT 値のほか、その他の値を返します。
| 戻り値 | 説明 |
|---|---|
| 応答データを正常に取得しました。 | |
| 応答データが最大バッファーサイズである 1 MB を超えています。ppBuffer パラメーターは NULL に設定され、pSize には応答データのサイズが格納されます。 | |
| 応答データを取得するには、ジョブの状態が BG_JOB_STATE_TRANSFERRED である必要があります。 | |
| このメソッドは、BG_JOB_TYPE_DOWNLOAD 型または BG_JOB_TYPE_UPLOAD 型のジョブでは実装されていません。 |
解説(Remarks)
GetReplyData メソッドを使用すると、 IBackgroundCopyJob::Complete メソッドの呼び出しの前後どちらでも応答データを読み取ることができます。ただし、応答ファイルから応答データを読み取るには、先に Complete メソッドを呼び出す必要があります。Complete メソッドを呼び出すまで、ファイルはクライアントから利用できません。
応答データが 1 MB を超える場合、 GetReplyData メソッドは BG_E_TOO_LARGE を返します (pSize には応答データのサイズが格納されます)。1 MB を超える応答を取得するには、 IBackgroundCopyJob2::GetReplyFileName メソッドを呼び出してファイル名を取得します。その後、そのファイルを開いて応答データを直接読み取ります。
例
GetReplyData メソッドを使用する例については、 Retrieving the Reply From an Upload-Reply Job を参照してください。
サーバーアプリケーションからの応答データを格納するファイルの名前を指定します。このメソッドは、ジョブの種類が BG_JOB_TYPE_UPLOAD_REPLY である場合にのみ呼び出してください。
| ReplyFileName | LPWSTR | in | 応答ファイルへのフルパスを含む null 終端文字列。ReplyFileNamePathSpec が NULL または空の文字列の場合、BITS がファイル名を生成します。パスやファイル名にワイルドカードは使用できず、パス内のディレクトリは存在している必要があります。パスは、null 終端文字を含めずに MAX_PATH までに制限されます。ユーザーには、そのディレクトリへの書き込み権限が必要です。BITS は NTFS ストリームをサポートしません。ネットワークドライブはセッション固有であるため使用せず、UNC パス (例: \\server\share\path\file) を使用してください。パスに \\? プレフィックスを含めないでください。 |
戻り値
このメソッドは、以下の HRESULT 値のほか、その他の値を返します。
| 戻り値 | 説明 |
|---|---|
| 応答データを格納するファイルの名前を正常に指定しました。 | |
| BITS がクライアントへの応答の転送を開始した後は、応答ファイル名を変更できません。状態が BG_JOB_STATE_TRANSFERRING で、かつ BG_JOB_REPLY_PROGRESS 構造体の BytesTotal メンバーが BG_SIZE_UNKNOWN でない場合、BITS はクライアントへ応答を転送中です。 | |
| ユーザーに、クライアント上の指定されたディレクトリへの書き込み権限がありません。 | |
| 応答ファイル名が無効であるか、MAX_PATH を超えています。 |
解説(Remarks)
最初に IBackgroundCopyJob::Resume メソッドを呼び出す前に SetReplyFileName メソッドを呼び出さなかった場合、BITS がファイル名を生成します。
BITS がファイル名を生成する場合、応答ファイルはローカルのアップロードファイルと同じディレクトリに書き込まれます。
SetReplyFileName メソッドは、BITS がサーバーアプリケーションから応答のダウンロードを開始するまでの間であればいつでも呼び出せます。ダウンロードが開始されている場合、このメソッドは失敗します。
応答ファイルは、 IBackgroundCopyJob::Complete メソッドを呼び出した後にクライアントから利用できるようになります。Complete メソッドを呼び出す前に応答データを取得するには、 IBackgroundCopyJob2::GetReplyData メソッドを呼び出します。
サーバーアプリケーションが応答を返さなかった場合、ファイルは空になります。
サーバーアプリケーションからの応答データを格納しているファイルの名前を取得します。このメソッドは、ジョブの種類が BG_JOB_TYPE_UPLOAD_REPLY である場合にのみ呼び出してください。
| pReplyFileName | LPWSTR* | out | 応答ファイルへのフルパスを含む null 終端文字列。使用後は CoTaskMemFree 関数を呼び出して pReplyFileName を解放してください。 |
戻り値
このメソッドは、以下の HRESULT 値のほか、その他の値を返します。
| 戻り値 | 説明 |
|---|---|
| 応答データを格納しているファイルの名前を正常に取得しました。 | |
| このメソッドは、BG_JOB_TYPE_DOWNLOAD 型または BG_JOB_TYPE_UPLOAD 型のジョブでは実装されていません。 |
解説(Remarks)
応答ファイル名を指定するには、 IBackgroundCopyJob2::SetReplyFileName メソッドを呼び出します。名前を指定しなかった場合、 GetReplyFileName メソッドは BITS が生成した名前を返します。名前を指定せず、かつジョブにファイルを追加する前にこのメソッドを呼び出した場合、pReplyFileName は NULL に設定されます。
応答ファイルを開いて読み取る前に、 IBackgroundCopyJob::Complete メソッドを呼び出す必要があります。Complete メソッドを呼び出すまで、応答ファイルはクライアントから利用できません。
サーバーアプリケーションが応答を返さなかった場合、ファイルは空になります。
例
GetReplyFileName メソッドを使用する例については、 Retrieving the Reply From an Upload-Reply Job を参照してください。
プロキシまたはリモートサーバーのユーザー認証要求に使用する資格情報を指定します。
| credentials | BG_AUTH_CREDENTIALS* | in | ユーザー認証に使用するターゲット (プロキシまたはサーバー)、認証スキーム、およびユーザーの資格情報を指定します。詳細については、 BG_AUTH_CREDENTIALS 構造体を参照してください。 |
戻り値
このメソッドは、以下の戻り値のほか、その他の値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功 | |
| 認識できないターゲットの列挙値です。 | |
| 認識できないスキームの列挙値です。 | |
| ユーザー名が長すぎます。上限については、BG_BASIC_CREDENTIALS 構造体を参照してください。 | |
| パスワードが長すぎます。上限については、BG_BASIC_CREDENTIALS 構造体を参照してください。 | |
| Basic または Digest スキームを指定する場合、BG_BASIC_CREDENTIALS 構造体の UserName メンバーおよび Password メンバーを NULL にすることはできません。 |
解説(Remarks)
BITS は、ユーザー認証の要求に応じてプロキシまたはサーバーに資格情報を提供します。資格情報は、最初に Resume を呼び出す前に設定してください。
提供したいターゲットとスキームの組み合わせごとに、このメソッドを呼び出す必要があります。たとえば、Basic 認証と Digest 認証の両方にプロキシの資格情報を指定したい場合、Basic の資格情報を指定するために 1 回、Digest の資格情報を指定するためにもう 1 回、このメソッドを呼び出します。
ジョブに同じターゲットとスキームの組み合わせの資格情報が既に含まれている場合、既存の資格情報は新しい資格情報で置き換えられます。資格情報はジョブの有効期間中保持されます。ジョブから資格情報を削除するには、 IBackgroundCopyJob2::RemoveCredentials メソッドを呼び出します。
プロキシまたはサーバーが要求するスキームが分かっている場合は、そのスキームの資格情報だけを提供できます。それ以外の場合は、すべてのスキームに対する資格情報を提供してください。
プロキシまたはサーバーが要求する資格情報を提供しなかった場合、あるいはプロキシまたはサーバーが資格情報を認証できなかった場合、ジョブは BG_JOB_STATE_ERROR 状態になります。認証がサーバーで失敗したのか (BG_E_HTTP_ERROR_401)、プロキシで失敗したのか (BG_E_HTTP_ERROR_407) は、エラーコードを確認して判断します。エラーコードを取得するには、 IBackgroundCopyJob::GetError メソッドを呼び出して IBackgroundCopyError インターフェイスポインターを取得します。その後、 IBackgroundCopyError::GetError メソッドを呼び出してエラーコードを取得します。認証がどこで失敗したか (プロキシかサーバーか) を特定したら、プロキシまたはサーバーに使用する新しい資格情報を指定し、 IBackgroundCopyJob::Resume メソッドを呼び出してジョブを再開します。どのスキームが失敗したかは判別できないため、 Resume メソッドを呼び出す前にすべてのスキームの資格情報を指定してください。
設定した資格情報を取得するメソッドはありません。
このメソッドは、ジョブの所有者のコンテキストで呼び出す必要があります。
IBackgroundCopyJob::TakeOwnership メソッドを呼び出すと、ジョブから資格情報が削除されます。
暗黙的な資格情報 (ログオン中のユーザーの資格情報) を指定するには、スキームを NTLM に設定し、ユーザー名とパスワードを NULL に設定します。プロキシに対して暗黙的な資格情報を指定した場合、明示的なサーバー資格情報を指定しない限り、BITS はサーバー認証にも暗黙的な資格情報を使用します。
例
次の例は、サーバーのユーザー認証要求に対して Basic の資格情報を指定するために SetCredentials メソッドを呼び出す方法を示しています。この例では、 CredUIPromptForCredentials 関数を使用してユーザー名とパスワードを取得しています。この例では、有効な IBackgroundCopyJob インターフェイスポインター pJob があることを前提としています。また、機密情報に関連付けられたメモリ領域をクリアするために SecureZeroMemory 関数を使用しています。SecureZeroMemory 関数は WinBase.h で定義されています。
#define MAX_STR_LENGTH 300+1 // BITS limit for user name and password
CREDUI_INFO cuiinfo;
WCHAR szUserName[MAX_STR_LENGTH];
WCHAR szPassword[MAX_STR_LENGTH];
DWORD rc;
IBackgroundCopyJob* pJob;
IBackgroundCopyJob2* pJob2 = NULL;
BG_AUTH_CREDENTIALS ac;
cuiinfo.cbSize = sizeof(CREDUI_INFO);
cuiinfo.hbmBanner = NULL;
cuiinfo.hwndParent = NULL; //Desktop is parent
cuiinfo.pszCaptionText = L"Server Authentication";
cuiinfo.pszMessageText = L"Enter user credentials for Basic authentication.";
//Initialize the UserName and Password fields. This example sets
//UserName to blank, but you could also set UserName to the owner
//of the job or the current user. For an example that retrieves the owner's
//name, see the example code for the IBackgroundCopyJob::GetOwner method.
szUserName[0] = L'\0';
szPassword[0] = L'\0';
rc = CredUIPromptForCredentials(&cuiinfo, NULL, NULL, 0,
szUserName, MAX_STR_LENGTH,
szPassword, MAX_STR_LENGTH,
NULL, CREDUI_FLAGS_DO_NOT_PERSIST | CREDUI_FLAGS_GENERIC_CREDENTIALS);
if (NO_ERROR == rc)
{
pJob->QueryInterface(__uuidof(IBackgroundCopyJob2), (void**)&pJob2);
ac.Target = BG_AUTH_TARGET_SERVER;
ac.Scheme = BG_AUTH_SCHEME_BASIC;
ac.Credentials.Basic.UserName = szUserName;
ac.Credentials.Basic.Password = szPassword;
hr = pJob2->SetCredentials(&ac);
if (FAILED(hr))
{
//Handle error
}
SecureZeroMemory(szUserName, sizeof(szUserName));
SecureZeroMemory(szPassword, sizeof(szPassword));
}
資格情報を使用対象から削除します。指定する資格情報は、IBackgroundCopyJob2::SetCredentials メソッドで設定した既存のターゲットとスキームの組み合わせに一致している必要があります。設定した資格情報を取得するメソッドはありません。
| Target | BG_AUTH_TARGET | in | 資格情報をプロキシ認証に使用するか、サーバー認証に使用するかを指定します。 |
| Scheme | BG_AUTH_SCHEME | in | 使用する認証スキーム (Basic、またはいくつかのチャレンジ/レスポンス方式のいずれか) を指定します。詳細については、 BG_AUTH_SCHEME 列挙型を参照してください。 |
戻り値
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IBackgroundCopyJob2 "{54B50739-686F-45EB-9DFF-D6A9A0FAA9AF}" #usecom global IBackgroundCopyJob2 IID_IBackgroundCopyJob2 "{}" #comfunc global IBackgroundCopyJob2_SetNotifyCmdLine 35 wstr,wstr #comfunc global IBackgroundCopyJob2_GetNotifyCmdLine 36 var,var #comfunc global IBackgroundCopyJob2_GetReplyProgress 37 var #comfunc global IBackgroundCopyJob2_GetReplyData 38 var,var #comfunc global IBackgroundCopyJob2_SetReplyFileName 39 wstr #comfunc global IBackgroundCopyJob2_GetReplyFileName 40 var #comfunc global IBackgroundCopyJob2_SetCredentials 41 var #comfunc global IBackgroundCopyJob2_RemoveCredentials 42 int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IBackgroundCopyJob2 "{54B50739-686F-45EB-9DFF-D6A9A0FAA9AF}" #usecom global IBackgroundCopyJob2 IID_IBackgroundCopyJob2 "{}" #comfunc global IBackgroundCopyJob2_SetNotifyCmdLine 35 wstr,wstr #comfunc global IBackgroundCopyJob2_GetNotifyCmdLine 36 sptr,sptr #comfunc global IBackgroundCopyJob2_GetReplyProgress 37 sptr #comfunc global IBackgroundCopyJob2_GetReplyData 38 sptr,sptr #comfunc global IBackgroundCopyJob2_SetReplyFileName 39 wstr #comfunc global IBackgroundCopyJob2_GetReplyFileName 40 sptr #comfunc global IBackgroundCopyJob2_SetCredentials 41 sptr #comfunc global IBackgroundCopyJob2_RemoveCredentials 42 int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。