IBackgroundCopyJob2::SetCredentials 方法 (bits1_5.h)
指定要用于代理或远程服务器用户身份验证请求的凭据。
语法
HRESULT SetCredentials(
[in] BG_AUTH_CREDENTIALS *credentials
);
参数
[in] credentials
标识目标 (代理或服务器) 、身份验证方案以及用于用户身份验证的用户凭据。 有关详细信息,请参阅 BG_AUTH_CREDENTIALS 结构。
返回值
此方法返回以下返回值以及其他返回值。
返回代码 | 说明 |
---|---|
|
成功 |
|
无法识别的目标枚举值。 |
|
无法识别的方案枚举值。 |
|
用户名太长。 有关限制,请参阅 BG_BASIC_CREDENTIALS 结构。 |
|
密码太长。 有关限制,请参阅 BG_BASIC_CREDENTIALS 结构。 |
|
如果指定“基本”或“摘要”方案, 则 BG_BASIC_CREDENTIALS 结构的 UserName 和 Password 成员不能为 NULL 。 |
注解
BITS 向代理服务器或服务器提供凭据,以响应用户身份验证请求。 在初始调用 Resume 之前设置凭据。
必须为每个要提供的目标和方案对调用此方法。 例如,如果要为基本身份验证和摘要式身份验证指定代理凭据,可以调用此方法一次以指定基本凭据,并再次调用一次以指定摘要凭据。
如果作业当前包含具有相同目标和方案对的凭据,现有凭据将替换为新凭据。 凭据在作业的生命周期内会保留。 若要从作业中删除凭据,请调用 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 还将使用隐式凭据进行服务器身份验证。
示例
以下示例演示如何调用 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));
}
要求
最低受支持的客户端 | Windows Vista |
最低受支持的服务器 | Windows Server 2003 |
目标平台 | Windows |
标头 | bits1_5.h (包括 Bits.h) |
Library | Bits.lib |
DLL | BitsPrx2.dll |
可再发行组件 | Windows XP 上的 BITS 1.5 |