RPC_CALL_ATTRIBUTES_V1_A 結構 (rpcasync.h)
RPC_CALL_ATTRIBUTES_V1 結構提供 RpcServerInqCallAttributes 函式的參數。 在適用於 Windows XP 和 Windows Server 2003 操作系統的 ANSI 和 UNICODE 版本中實作。
語法
typedef struct tagRPC_CALL_ATTRIBUTES_V1_A {
unsigned int Version;
unsigned long Flags;
unsigned long ServerPrincipalNameBufferLength;
unsigned char *ServerPrincipalName;
unsigned long ClientPrincipalNameBufferLength;
unsigned char *ClientPrincipalName;
unsigned long AuthenticationLevel;
unsigned long AuthenticationService;
BOOL NullSession;
} RPC_CALL_ATTRIBUTES_V1_A;
成員
Version
呼叫應用程式所使用的 RpcServerInqCallAttributes 函式版本。 請參閱<備註>。
Flags
指定有效旗標以要求RPC_QUERY_SERVER_PRINCIPAL_NAME或RPC_QUERY_CLIENT_PRINCIPAL_NAME的位掩碼。 請參閱<備註>。
ServerPrincipalNameBufferLength
ServerPrincipalName 的長度,以位元組為單位。 如果不足, ServerPrincipalName 會保持不變,而 ServerPrincipalNameBufferLength 表示必要的緩衝區長度,包括終止 NULL 字元,並傳回ERROR_MORE_DATA。 如果 ServerPrincipalNameBufferLength 超過必要時間,則會在傳回時設定為實際使用的長度,以位元組為單位,包括終止 NULL 字元。 請參閱<備註>。
如果通訊協定序列不支援擷取伺服器主體名稱, ServerPrincipalNameBufferLength 會在傳回時設定為零,而且 ServerPrincipalName 所指向的緩衝區未修改。 Windowsxp: 只有通訊協定序列 的ncacn_* 群組支援擷取伺服器主體名稱。
如果未指定RPC_QUERY_SERVER_PRINCIPAL_NAME旗標, 則會忽略 ServerPrincipalNameBufferLength 。 如果 ServerPrincipalNameBufferLength 為非零, 且 ServerPrincipalName 為 NULL,則會傳回ERROR_INVALID_PARAMETER。
ServerPrincipalName
如果 旗 標中要求且通訊協議順序支援,則為伺服器主體名稱的指標。 在RPC_S_OK或ERROR_MORE_DATA以外的任何傳回值時, ServerPrincipalName 的內容未定義且可能已由 RPC 修改。
ClientPrincipalNameBufferLength
ClientPrincipalName 所指向的緩衝區長度,以位元組為單位。 如果不足, ClientPrincipalName 保持不變, ClientPrincipalNameBufferLength 表示必要的緩衝區長度,包括終止 NULL 字元,並傳回ERROR_MORE_DATA。 如果 ClientPrincipalNameBufferLength 超過必要時間,則會在傳回時設定為實際使用的長度,以位元組為單位,包括終止 的 NULL 字元。
如果通訊協定序列不支援擷取客戶端主體名稱, ClientPrincipalNameBufferLength 會在傳回時設定為零, 且 ClientPrincipalName 所指向的緩衝區未修改。 Windowsxp: 只有 ncalrpc 通訊協定序列支援擷取客戶端主體名稱。
如果未指定RPC_QUERY_CLIENT_PRINCIPAL_NAME旗標, 則會忽略 ClientPrincipalNameBufferLength 。 如果 ClientPrincipalNameBufferLength 為非零, 且 ClientPrincipalName 為 NULL,則會傳回ERROR_INVALID_PARAMETER。
ClientPrincipalName
如果 Flags 成員中要求且通訊協定序列支援,則為客戶端主體名稱的指標。 在RPC_S_OK或ERROR_MORE_DATA以外的任何傳回值時, ClientPrincipalName 的內容未定義且可能已由 RPC 修改。
AuthenticationLevel
呼叫的驗證層級。 如需 RPC 支援的驗證層級,請參閱 驗證層級常數 。
AuthenticationService
用來進行遠端過程調用的驗證服務或安全性提供者。
NullSession
指定是否使用 Null 工作階段。 零表示呼叫未通過 Null 會話;任何其他值表示 Null 工作階段。
備註
RPC_CALL_ATTRIBUTES 結構會使用版本設定配置,讓 RpcServerInqCallAttributes 函式納入新功能,而不需要引進具有後綴標識碼的新函式。 例如,在標頭中使用簡單 #define 識別的第二個RPC_CALL_ATTRIBUTES版本,可以新增成員,以協助未來版本的 RpcServerInqCallAttributes 函式內建的新功能,而不需要釋放對應的替代函式。
Version 成員表示呼叫應用程式目前RPC_CALL_ATTRIBUTES_V1或RPC_CALL_ATTRIBUTES_V2) 所使用的RPC_CALL_ATTRIBUTES (結構版本。 此識別可讓 RPC 執行時間為不使用最新版結構的應用程式提供回溯相容性。
在 Flags 成員中指定RPC_QUERY_SERVER_PRINCIPAL_NAME會指示 RpcServerInqCallAttributes 傳回 ServerPrincipalName 中的伺服器主體名稱。 如果未指定 RPC_QUERY_SERVER_PRINCIPAL_NAME,RpcServerInqCallAttributes 不會修改 在 ServerPrincipalName 中傳遞的指標,也不會將該記憶體位置中儲存任何專案。 在 Flags 成員中指定RPC_QUERY_CLIENT_PRINCIPAL_NAME會指示 RpcServerInqCallAttributes ,以傳回 ClientPrincipalName 中的客戶端主體名稱。 如果未指定 RPC_QUERY_CLIENT_PRINCIPAL_NAME,RpcServerInqCallAttributes 不會修改在 ClientPrincipalName 中傳遞的指標,也不會將該記憶體位置中儲存任何專案。
擷取客戶端和伺服器主體名稱時的最佳處理機制是儲存 ClientPrincipalNameBufferLength 和 ServerPrincipalNameBufferLength 的長度,如果傳回ERROR_MORE_DATA,請比較預存長度與這些成員中傳回的長度。 儲存值小於或等於傳回值的成員已成功傳回,表示另一個成員的緩衝區不足。 在後續呼叫中,省略成功傳回主體名稱的旗標;這可避免處理與成功傳回之主體名稱的另一個擷取和複本相關聯的處理。
RPC_CALL_ATTRIBUTES_V1 結構通常以兩種方式呼叫:
- 第一種方法:針對第一個 RpcServerInqCallAttributes 函式呼叫上的 ServerPrincipalNameBufferLength 或 ClientPrincipalNameBufferLength 成員指定零,以擷取所需的緩衝區長度,或判斷通訊協定是否支援傳回主體名稱。 擷取所需的緩衝區長度時,會配置緩衝區所需的長度,並進行第二次呼叫以取得緩衝區的實際長度。
- 第二種方法:呼叫端會以合理的緩衝區開始,通常會在堆棧上配置,如果傳回ERROR_MORE_DATA,則會配置必要長度的緩衝區,並再次呼叫 RpcServerInqCallAttributes 函式。
範例
RPC_CALL_ATTRIBUTES CallAttributes; // this maps to RPC_CALL_ATTRIBUTES_V1
memset(&CallAttributes, 0, sizeof(CallAttributes));
CallAttributes.Version = RPC_CALL_ATTRIBUTES_VERSION; // maps to 1
CallAttributes.Flags = ;//....
Status = RpcServerInqCallAttributes(0, &CallAttributes);
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2003 [僅限傳統型應用程式] |
標頭 | rpcasync.h (包含 Rpc.h) |