IClientSecurity::SetBlanket 方法 (objidl.h)

(用于对指定代理进行调用的安全) 设置身份验证信息。

此设置将替代指定代理的进程默认设置。 调用此方法会更改指定代理的所有其他用户的安全值。

语法

HRESULT SetBlanket(
  [in] IUnknown *pProxy,
  [in] DWORD    dwAuthnSvc,
  [in] DWORD    dwAuthzSvc,
  [in] OLECHAR  *pServerPrincName,
  [in] DWORD    dwAuthnLevel,
  [in] DWORD    dwImpLevel,
  [in] void     *pAuthInfo,
  [in] DWORD    dwCapabilities
);

参数

[in] pProxy

指向代理的指针。

[in] dwAuthnSvc

身份验证服务。 这是从 身份验证服务常量列表中获取的单个值。 如果不需要身份验证,请使用 RPC_C_AUTHN_NONE。 如果指定了RPC_C_AUTHN_DEFAULT,COM 将按照其常规安全一揽子协商算法选择身份验证服务。

[in] dwAuthzSvc

授权服务。 这是从 授权常量列表中获取的单个值。 如果指定了RPC_C_AUTHZ_DEFAULT,COM 将按照其常规安全一揽子协商算法选择授权服务。 如果将 NTLMSSP、Kerberos 或 Schannel 用作身份验证服务,则应将RPC_C_AUTHZ_NONE用作授权服务。

[in] pServerPrincName

服务器主体名称。 如果指定了COLE_DEFAULT_PRINCIPAL,DCOM 将使用其安全总协商算法选取主体名称。 如果使用 Kerberos 作为身份验证服务,则此参数必须是服务器的正确主体名称,否则调用将失败。

如果使用 Schannel 作为身份验证服务,则此值必须是 主体名称中所述的 msstd 或 fullsic 形式之一;如果不需要相互身份验证,此值必须为 NULL

通常,指定 NULL 不会重置代理上的服务器主体名称,而是保留以前的设置。 在为代理选择其他身份验证服务时,使用 NULL 作为 pServerPrincName 时必须小心,因为无法保证以前设置的主体名称对新选择的身份验证服务有效。

[in] dwAuthnLevel

身份验证级别。 这是从 身份验证级别常量列表中获取的单个值。 如果指定了RPC_C_AUTHN_LEVEL_DEFAULT,COM 将选择遵循其常规安全一揽子协商算法的身份验证级别。 如果此值设置为 RPC_C_AUTHN_LEVEL_NONE,则必须RPC_C_AUTHN_NONE身份验证服务。 每个身份验证服务可以选择使用比指定的身份验证级别更高的安全身份验证级别。

[in] dwImpLevel

模拟级别。 这是从 模拟级别常量列表中获取的单个值。 如果指定了RPC_C_IMP_LEVEL_DEFAULT,COM 将按照其正常的安全一揽子协商算法选择模拟级别。 如果远程使用 NTLMSSP,则必须RPC_C_IMP_LEVEL_IMPERSONATE或RPC_C_IMP_LEVEL_IDENTIFY此值。 在同一台计算机上使用 NTLMSSP 时,还支持RPC_C_IMP_LEVEL_DELEGATE。 对于 Kerberos,此值可以是RPC_C_IMP_LEVEL_IDENTIFY、RPC_C_IMP_LEVEL_IMPERSONATE或RPC_C_IMP_LEVEL_DELEGATE。 对于 Schannel,此值必须RPC_C_IMP_LEVEL_IMPERSONATE。

[in] pAuthInfo

指示客户端标识的RPC_AUTH_IDENTITY_HANDLE值。 此参数不用于同一计算机上的调用。 如果 pAuthInfoNULL,则 COM 使用当前代理标识,即进程令牌、模拟令牌或 CoInitializeSecurity 函数中的身份验证标识。 如果句柄不为 NULL,则使用该标识。 句柄引用的结构的格式取决于身份验证服务的提供程序。

对于 NTLMSSP 或 Kerberos,结构是 SEC_WINNT_AUTH_IDENTITYSEC_WINNT_AUTH_IDENTITY_EX 结构。 如果客户端通过调用 CoQueryProxyBlanket 获取在代理上设置的凭据,则必须确保在代理上设置不同的标识或释放对象上的所有代理之前内存保持有效且保持不变。

如果此参数为 NULL,则 COM 使用当前代理标识 (,即进程令牌或模拟令牌) 。 如果句柄引用结构,则使用该标识。

对于 Schannel,此参数必须是指向包含客户端 X.509 证书 的CERT_CONTEXT 结构的指针;如果客户端希望与服务器建立匿名连接,则此参数必须是 NULL 。 如果指定了证书,则只要当前单元中存在对象的任何代理,调用方就不得释放该证书。

对于 Snego,此成员为 NULL,指向 SEC_WINNT_AUTH_IDENTITY 结构,或指向 SEC_WINNT_AUTH_IDENTITY_EX 结构。 如果为 NULL,Snego 将根据客户端计算机上可用的身份验证服务选择一个列表。 如果它指向 SEC_WINNT_AUTH_IDENTITY_EX 结构,则结构的 PackageList 成员必须指向包含以逗号分隔的身份验证服务名称列表的字符串, 而 PackageListLength 成员必须提供 PackageList 字符串中的字节数。 如果 PackageListNULL,则使用 Snego 的所有调用都将失败。

如果指定了COLE_DEFAULT_AUTHINFO,COM 将按照其正常的安全一揽子协商算法选取身份验证信息。

如果同时设置了 pAuthInfo,并在 dwCapabilities 中设置了其中一个隐藏标志,则 SetBlanket 将返回错误。

[in] dwCapabilities

此代理的功能。 功能标志在 EOLE_AUTHENTICATION_CAPABILITIES 枚举中定义。 可通过此方法设置的唯一标志是EOAC_MUTUAL_AUTH、EOAC_STATIC_CLOAKING、EOAC_DYNAMIC_CLOAKING,EOAC_ANY_AUTHORITY () 、EOAC_MAKE_FULLSIC和EOAC_DEFAULT弃用此标志。 如果未设置 pAuthInfo 且 Schannel 不是身份验证服务,则可以设置 EOAC_STATIC_CLOAKING 或 EOAC_DYNAMIC_CLOAKING。 (有关详细信息,请参阅 Cloaking 。) 如果指示了此处提及的功能标志以外的任何功能标志, SetBlanket 将返回错误。

返回值

此方法可以返回以下值。

返回代码 说明
S_OK
该方法已成功完成。
E_INVALIDARG
一个或多个参数无效。

注解

SetBlanket 设置将用于对指定接口代理进行调用的身份验证信息。 此处指定的值将覆盖自动安全性选择的值。 调用此方法会更改指定代理的所有其他用户的安全值。 如果希望更改仅适用于代理的特定实例,请调用 IClientSecurity::CopyProxy 以创建代理的专用副本,然后在副本上调用 SetBlanket

每当调用此方法时,DCOM 都会在代理上设置标识,将来使用此代理进行的调用将使用此标识。 调用 SetBlanket 时正在进行的调用将使用发起调用时代理上的身份验证信息。 如果 pAuthInfoNULL,则代理标识默认为当前进程令牌 (,除非在调用 CoInitializeSecurity) 时指定了身份验证标识。 请参阅 隐藏 ,了解 pAuthInfoNULL 时隐藏标志如何影响代理。

默认情况下,COM 将选择客户端和服务器计算机上可用的第一个可用的身份验证服务和授权服务,以及服务器为该身份验证服务注册的主体名称。 目前,如果第一个身份验证服务失败,COM 将不会尝试其他身份验证服务。

SetBlanket 中指定 dwImpLevel 的默认常量时,参数默认为指定给 CoInitializeSecurity 的值。 如果未调用 CoInitializeSecurity ,则默认为 RPC_C_IMP_LEVEL_IDENTIFY。

代理上 dwAuthnLevel 的初始值将是客户端调用 CoInitializeSecurity 和服务器调用 CoInitializeSecurity 时设置的值的较高值。 对于未调用 CoInitializeSecurity 的任何进程,默认身份验证级别为RPC_C_AUTHN_CONNECT。

可以使用 DCOMCNFG 设置不调用 CoInitializeSecurity 的进程的默认身份验证和模拟级别。

如果为 dwCapabilities 指定了 EOAC_DEFAULT,则将使用 CoInitializeSecurity 中的有效功能。 如果未调用 CoInitializeSecurity,EOAC_NONE 将用于功能标志。

如果在同一代理上的两个线程上同时调用 SetBlanket ,则只会应用一组更改。 如果在同一代理上的两个线程上同时调用 SetBlanketCRpcOptions::Set ,则这两个更改都可以应用,或者只能应用一个更改。

无法在 IClientSecurity 接口等本地接口上设置安全信息。 但是,由于该接口仅在本地受支持,因此无需安全性。 IUnknownIMultiQI 是特殊情况。 位置实现进行远程调用以支持这些接口。 SetBlanket 可用于 IUnknownIMultiQI 将使用 IUnknown 上的安全设置。

若要更改一个 SetBlanket 参数而无需处理其他参数,可以指定其他参数的默认常量。 应用程序可以通过将所有其他参数设置为默认常量来更改 ((例如身份验证级别) )并忽略其他参数(包括身份验证服务)。

请注意,将所有未使用的参数设置为默认常量非常重要,因为默认值通常并不明显。 具体而言,如果将身份验证服务设置为默认值,则应将身份验证信息和主体名称设置为默认值。 这有两个原因:首先,身份验证信息的类型取决于 DCOM 选择的身份验证服务。 其次,由于 DCOM 需要为某些身份验证服务传递一些复杂的身份验证信息,因此如果将身份验证服务设置为默认值,并将身份验证信息设置为 NULL,则可能会获得不起作用的安全设置。

要求

要求
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 objidl.h (包括 ObjIdl.h)

另请参阅

CoQueryProxyBlanket

CoSetProxyBlanket

IClientSecurity