IClientSecurity::SetBlanket 方法 (objidl.h)
設定 (安全性) 驗證資訊,以用於在指定的 Proxy 上進行呼叫。
此設定會覆寫指定 Proxy 的進程預設設定。 呼叫這個方法會變更指定 Proxy 所有其他使用者的安全性值。
語法
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
Proxy 的指標。
[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 不會重設 Proxy 上的伺服器主體名稱,而是保留先前的設定。 選取 Proxy 的不同驗證服務時,您必須小心使用 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。 針對安全通道,此值必須RPC_C_IMP_LEVEL_IMPERSONATE。
[in] pAuthInfo
指出用戶端身分識別的RPC_AUTH_IDENTITY_HANDLE值。 此參數不會用於同一部電腦上的呼叫。 如果 pAuthInfo 為 NULL,COM 會使用目前的 Proxy 身分識別,也就是進程令牌、模擬令牌或 來自 CoInitializeSecurity 函式的驗證身分識別。 如果句柄不是 NULL,則會使用該身分識別。 句柄所參考的結構格式取決於驗證服務的提供者。
針對 NTLMSSP 或 Kerberos,結構是 SEC_WINNT_AUTH_IDENTITY 或 SEC_WINNT_AUTH_IDENTITY_EX 結構。 如果客戶端藉由呼叫 CoQueryProxyBlanket 來取得 Proxy 上設定的認證,則必須確保記憶體維持有效且不變,直到在 Proxy 上設定不同的身分識別,或釋放物件上的所有 Proxy 為止。
如果此參數為 NULL,COM 會使用目前的 Proxy 身分識別 (,也就是進程令牌或模擬令牌) 。 如果句柄參考結構,則會使用該身分識別。
針對安全通道,此參數必須是包含用戶端 X.509 憑證 之CERT_CONTEXT 結構的指標,如果用戶端想要建立與伺服器的匿名連線,則為 NULL 。 如果指定了憑證,只要物件的任何 Proxy 存在於目前 Apartment 中,呼叫端就不得釋放它。
對於 Snego,此成員為 NULL、指向 SEC_WINNT_AUTH_IDENTITY 結構,或指向 SEC_WINNT_AUTH_IDENTITY_EX 結構。 如果是 NULL,Snego 會根據用戶端電腦上可用的驗證服務來挑選驗證服務清單。 如果指向 SEC_WINNT_AUTH_IDENTITY_EX 結構,結構的 PackageList 成員必須指向包含驗證服務名稱逗號分隔清單的字串, 而 PackageListLength 成員必須提供 PackageList 字串中的位元組數。 如果 PackageList 為 NULL,則所有使用 Snego 的呼叫都會失敗。
如果指定了COLE_DEFAULT_AUTHINFO,COM 會遵循其一般安全性條件交涉演算法來挑選驗證資訊。
如果已設定 pAuthInfo,且其中一個封閉旗標在 dwCapabilities 中設定,SetBlanket 將會傳回錯誤。
[in] dwCapabilities
此 Proxy 的功能。 功能旗標定義於 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 會傳回錯誤。
傳回值
這個方法可以傳回下列值。
傳回碼 | 描述 |
---|---|
|
已成功完成命令。 |
|
一或多個自變數無效。 |
備註
SetBlanket 會設定驗證資訊,用來在指定的介面 Proxy 上進行呼叫。 此處指定的值會覆寫自動安全性所選擇的值。 呼叫這個方法會變更指定 Proxy 所有其他使用者的安全性值。 如果您想要只將變更套用至 Proxy 的特定實例,請呼叫 IClientSecurity::CopyProxy 以建立 Proxy 的私人復本,然後在複製上呼叫 SetBlanket 。
每當呼叫此方法時,DCOM 會在 Proxy 上設定身分識別,而使用此 Proxy 進行的未來呼叫將會使用此身分識別。 呼叫 SetBlanket 時進行中的呼叫將會在呼叫啟動時使用 Proxy 上的驗證資訊。 如果 pAuthInfo 為 NULL,除非在 呼叫 CoInitializeSecurity) 時指定驗證身分識別,否則 Proxy 身分識別預設為目前的進程令牌 (。 請參閱 Cloaking 以了解 當 pAuthInfo 為 NULL 時,遮蔽旗標如何影響 Proxy。
根據預設,COM 會選擇客戶端和伺服器計算機上可用的第一個可用驗證服務和授權服務,以及伺服器註冊該驗證服務的主體名稱。 目前,如果第一個驗證服務失敗,COM 將不會嘗試另一個驗證服務。
當 SetBlanket 中指定 dwImpLevel 的預設常數時,參數會預設為 CoInitializeSecurity 所指定的值。 如果未呼叫 CoInitializeSecurity ,則預設為RPC_C_IMP_LEVEL_IDENTIFY。
Proxy 上 dwAuthnLevel 的初始值會是用戶端呼叫 CoInitializeSecurity 和伺服器對 CoInitializeSecurity 的呼叫上設定的值越高。 對於未呼叫 CoInitializeSecurity 的任何進程,預設驗證層級會RPC_C_AUTHN_CONNECT。
未呼叫 CoInitializeSecurity 之進程的預設驗證和模擬層級可以使用 DCOMCNFG 設定。
如果為 dwCapabilities 指定EOAC_DEFAULT,將會使用 CoInitializeSecurity 的有效功能。 如果未呼叫 CoInitializeSecurity,EOAC_NONE 將用於功能旗標。
如果在相同 Proxy 上的兩個線程上同時呼叫 SetBlanket ,則只會套用一組變更。 如果在相同 Proxy 上的兩個線程上同時呼叫 SetBlanket 和 CRpcOptions::Set ,則可能會套用這兩項變更,或只套用一個變更。
無法在本機介面上設定安全性資訊,例如 IClientSecurity 介面。 不過,由於該介面僅在本機受到支援,因此不需要安全性。 IUnknown 和 IMultiQI 是特殊案例。 位置實作會進行遠端呼叫以支持這些介面。 SetBlanket 可用於 IUnknown。 IMultiQI 將使用 IUnknown 的安全性設定。
若要變更一個 SetBlanket 參數,而不需要處理其他參數,一個可以指定其他參數的預設常數。 應用程式可以變更參數 (,例如驗證層級) ,並忽略其他參數,包括驗證服務,方法是將所有其他參數設定為預設常數。
請注意,請務必將所有未使用的參數設定為預設常數,因為預設值通常並不明顯。 特別是,如果您將驗證服務設定為預設值,則應該將驗證資訊和主體名稱設定為預設值。 這是兩種原因:首先,驗證資訊的類型取決於驗證服務 DCOM 選擇。 其次,因為 DCOM 需要針對特定驗證服務傳遞一些複雜的驗證資訊,如果您將驗證服務設定為預設值,並將驗證資訊設定為 NULL,您可能會取得無法運作的安全性設定。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 專業版 [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows 2000 Server [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | objidl.h (包含 ObjIdl.h) |