Win32 API 日本語リファレンス
ホームSystem.Rpc › RPC_HTTP_TRANSPORT_CREDENTIALS_A

RPC_HTTP_TRANSPORT_CREDENTIALS_A

構造体
サイズx64: 40 バイト / x86: 24 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
TransportCredentialsSEC_WINNT_AUTH_IDENTITY_A*8/4+0+0ユーザーのユーザー名、ドメイン、パスワードを格納する SEC_WINNT_AUTH_IDENTITY 構造体へのポインターです。
FlagsRPC_C_HTTP_FLAGS4+8+4

ビット単位のOR演算子で組み合わせることができるフラグのセットです。

意味
RPC_C_HTTP_FLAG_USE_SSL
RPC プロキシとの通信に SSL を使用するよう RPC に指示します。
RPC_C_HTTP_FLAG_USE_FIRST_AUTH_SCHEME
設定した場合、RPC は AuthnSchemes 配列の最初のスキームを選択し、RPC プロキシへの認証を試みます。RPC プロキシが選択された認証スキームをサポートしていない場合、呼び出しは失敗します。設定しない場合、RPC クライアントは RPC プロキシに対してサポートされている認証スキームを問い合わせ、その中から 1 つを選択します。
AuthenticationTargetRPC_C_HTTP_AUTHN_TARGET4+12+8

認証のターゲットを指定します。

次の値のいずれか、または両方を設定します。

意味
RPC_C_HTTP_AUTHN_TARGET_SERVER
RPC プロキシ (HTTP の観点では HTTP サーバー) に対して認証します。最も一般的な値です。
RPC_C_HTTP_AUTHN_TARGET_PROXY
HTTP プロキシに対して認証します。この値が使用されることはまれです。
NumberOfAuthnSchemesDWORD4+16+12AuthnScheme 配列の要素数です。
AuthnSchemesDWORD*8/4+24+16許可する認証スキームのIDの配列へのポインター。
ServerCertificateSubjectBYTE*8/4+32+20

想定されるサーバーのプリンシパル名を格納する省略可能な文字列です。プリンシパル名の形式は RpcCertGeneratePrincipalName が生成するものと同じです (詳細については Principal Names を参照してください)。このメンバーは SSL を使用する場合にのみ使用されます。その場合、サーバー証明書は生成されたプリンシパル名と照合され、一致しない場合はエラーが返されます。このメンバーにより、クライアントは RPC プロキシを認証できます。

- AuthnScheme

クライアントが使用してもよい認証スキームの配列へのポインターです。配列の各要素には、次の定数のいずれかを指定できます。

RPC_C_HTTP_AUTHN_SCHEME_BASIC

RPC_C_HTTP_AUTHN_SCHEME_NTLM

RPC_C_HTTP_AUTHN_SCHEME_PASSPORT

RPC_C_HTTP_AUTHN_SCHEME_DIGEST

RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE

RPC_C_HTTP_AUTHN_SCHEME_PASSPORTRPC_C_HTTP_AUTHN_SCHEME_NEGOTIATERPC_C_HTTP_AUTHN_SCHEME_DIGEST は定数として定義されていますが、現在はサポートされていません。呼び出し元はこれらを指定しないでください。指定すると RPC_S_CANNOT_SUPPORT エラーになります。各定数は 1 回のみ指定できます。RPC はパフォーマンス上の理由からこの制限を検証しませんが、同じ定数を複数回指定した場合の動作は未定義です。

実際の認証スキームを選択するアルゴリズムは次のとおりです。

RPC_C_HTTP_FLAG_USE_FIRST_AUTH_SCHEME が指定されている場合、最初の認証スキームが選択されます。それがサーバーでサポートされていない場合、接続の確立は失敗します。RPC_C_HTTP_FLAG_USE_FIRST_AUTH_SCHEME が指定されていない場合、RPC クライアントはまず RPC プロキシへの匿名接続を試みます。IIS が認証チャレンジを返した場合、サーバーが優先する認証スキームが AuthnScheme 配列にも含まれていれば、RPC クライアントはそのスキームを選択します。サーバーが優先するスキームが AuthnScheme 配列に含まれていない場合は、AuthnScheme 配列が先頭から末尾まで走査され、サーバーでもサポートされているスキームが見つかれば、その認証スキームが使用されます。

公式ドキュメント

RPC_HTTP_TRANSPORT_CREDENTIALS 構造体は、RPC/HTTP を使用する際に RPC プロキシ サーバーへ認証するための追加の資格情報を定義します。

解説(Remarks)

TransportCredentials メンバーが NULL で、認証スキームが NTLM の場合は、現在ログオンしているユーザーの資格情報が使用されます。脆弱な LM ハッシュによってネットワーク上にユーザーの資格情報が露出することを避けるため、ユーザーのログオン資格情報が使用されるのは、次の条件の一方または両方が満たされる場合のみです。

RpcBindingSetAuthInfoEx 関数の Unicode バージョンを使用する場合は、RPC_HTTP_TRANSPORT_CREDENTIALS および SEC_WINNT_AUTH_IDENTITY 構造体の Unicode バージョンも指定する必要があり、TransportCredentials 内の Flags メンバーには SEC_WINNT_AUTH_IDENTITY_UNICODE を設定しなければなりません。 RpcBindingSetAuthInfoEx 関数の ANSI バージョンを使用する場合は、RPC_HTTP_TRANSPORT_CREDENTIALS および SEC_WINNT_AUTH_IDENTITY 構造体の ANSI バージョンを指定する必要があり、TransportCredentials 内の Flags メンバーには SEC_WINNT_AUTH_IDENTITY_ANSI を設定しなければなりません。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// RPC_HTTP_TRANSPORT_CREDENTIALS_A  (x64 40 / x86 24 バイト)
typedef struct RPC_HTTP_TRANSPORT_CREDENTIALS_A {
    SEC_WINNT_AUTH_IDENTITY_A* TransportCredentials;
    RPC_C_HTTP_FLAGS Flags;
    RPC_C_HTTP_AUTHN_TARGET AuthenticationTarget;
    DWORD NumberOfAuthnSchemes;
    DWORD* AuthnSchemes;
    BYTE* ServerCertificateSubject;
} RPC_HTTP_TRANSPORT_CREDENTIALS_A;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_HTTP_TRANSPORT_CREDENTIALS_A
{
    public IntPtr TransportCredentials;
    public uint Flags;
    public uint AuthenticationTarget;
    public uint NumberOfAuthnSchemes;
    public IntPtr AuthnSchemes;
    public IntPtr ServerCertificateSubject;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RPC_HTTP_TRANSPORT_CREDENTIALS_A
    Public TransportCredentials As IntPtr
    Public Flags As UInteger
    Public AuthenticationTarget As UInteger
    Public NumberOfAuthnSchemes As UInteger
    Public AuthnSchemes As IntPtr
    Public ServerCertificateSubject As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class RPC_HTTP_TRANSPORT_CREDENTIALS_A(ctypes.Structure):
    _fields_ = [
        ("TransportCredentials", ctypes.c_void_p),
        ("Flags", wintypes.DWORD),
        ("AuthenticationTarget", wintypes.DWORD),
        ("NumberOfAuthnSchemes", wintypes.DWORD),
        ("AuthnSchemes", ctypes.c_void_p),
        ("ServerCertificateSubject", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct RPC_HTTP_TRANSPORT_CREDENTIALS_A {
    pub TransportCredentials: *mut core::ffi::c_void,
    pub Flags: u32,
    pub AuthenticationTarget: u32,
    pub NumberOfAuthnSchemes: u32,
    pub AuthnSchemes: *mut core::ffi::c_void,
    pub ServerCertificateSubject: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type RPC_HTTP_TRANSPORT_CREDENTIALS_A struct {
	TransportCredentials uintptr
	Flags uint32
	AuthenticationTarget uint32
	NumberOfAuthnSchemes uint32
	AuthnSchemes uintptr
	ServerCertificateSubject uintptr
}
type
  RPC_HTTP_TRANSPORT_CREDENTIALS_A = record
    TransportCredentials: Pointer;
    Flags: DWORD;
    AuthenticationTarget: DWORD;
    NumberOfAuthnSchemes: DWORD;
    AuthnSchemes: Pointer;
    ServerCertificateSubject: Pointer;
  end;
const RPC_HTTP_TRANSPORT_CREDENTIALS_A = extern struct {
    TransportCredentials: ?*anyopaque,
    Flags: u32,
    AuthenticationTarget: u32,
    NumberOfAuthnSchemes: u32,
    AuthnSchemes: ?*anyopaque,
    ServerCertificateSubject: ?*anyopaque,
};
type
  RPC_HTTP_TRANSPORT_CREDENTIALS_A {.bycopy.} = object
    TransportCredentials: pointer
    Flags: uint32
    AuthenticationTarget: uint32
    NumberOfAuthnSchemes: uint32
    AuthnSchemes: pointer
    ServerCertificateSubject: pointer
struct RPC_HTTP_TRANSPORT_CREDENTIALS_A
{
    void* TransportCredentials;
    uint Flags;
    uint AuthenticationTarget;
    uint NumberOfAuthnSchemes;
    void* AuthnSchemes;
    void* ServerCertificateSubject;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; RPC_HTTP_TRANSPORT_CREDENTIALS_A サイズ: 24 バイト(x86)
dim st, 6    ; 4byte整数×6(構造体サイズ 24 / 4 切り上げ)
; TransportCredentials : SEC_WINNT_AUTH_IDENTITY_A* (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; Flags : RPC_C_HTTP_FLAGS (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; AuthenticationTarget : RPC_C_HTTP_AUTHN_TARGET (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; NumberOfAuthnSchemes : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; AuthnSchemes : DWORD* (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; ServerCertificateSubject : BYTE* (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RPC_HTTP_TRANSPORT_CREDENTIALS_A サイズ: 40 バイト(x64)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; TransportCredentials : SEC_WINNT_AUTH_IDENTITY_A* (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Flags : RPC_C_HTTP_FLAGS (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; AuthenticationTarget : RPC_C_HTTP_AUTHN_TARGET (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; NumberOfAuthnSchemes : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; AuthnSchemes : DWORD* (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; ServerCertificateSubject : BYTE* (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global RPC_HTTP_TRANSPORT_CREDENTIALS_A
    #field intptr TransportCredentials
    #field int Flags
    #field int AuthenticationTarget
    #field int NumberOfAuthnSchemes
    #field intptr AuthnSchemes
    #field intptr ServerCertificateSubject
#endstruct

stdim st, RPC_HTTP_TRANSPORT_CREDENTIALS_A        ; NSTRUCT 変数を確保
st->Flags = 100
mes "Flags=" + st->Flags