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

RPC_HTTP_TRANSPORT_CREDENTIALS_V2_W

構造体
サイズx64: 64 バイト / x86: 36 バイト

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

フィールド

フィールドサイズx64x86説明
TransportCredentialsSEC_WINNT_AUTH_IDENTITY_W*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

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

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_NEGOTIATE、および RPC_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 が認証チャレンジを返した場合、RPC クライアントは、サーバーが優先する認証スキームが AuthnScheme 配列にも含まれていれば、そのスキームを選択します。サーバーが優先するスキームが AuthnScheme 配列に含まれていない場合は、AuthnScheme 配列を先頭から末尾まで順に走査し、サーバーでもサポートされているスキームが見つかれば、その認証スキームが使用されます。

ServerCertificateSubjectWORD*8/4+32+20想定されるサーバー プリンシパル名を格納する省略可能な文字列です。プリンシパル名の形式は RpcCertGeneratePrincipalName で生成されるものと同じです (詳細については Principal Names を参照してください)。このメンバーは SSL を使用する場合にのみ使用されます。その場合、サーバー証明書は生成されたプリンシパル名と照合されます。一致しない場合はエラーが返されます。このメンバーにより、クライアントは RPC プロキシを認証できます。
ProxyCredentialsSEC_WINNT_AUTH_IDENTITY_W*8/4+40+24HTTP プロキシ サーバーに対して認証する際に使用する、ユーザーのユーザー名、ドメイン、およびパスワードを格納する SEC_WINNT_AUTH_IDENTITY 構造体へのポインターです。ProxyCredentials は、AuthenticationTargetRPC_C_HTTP_AUTHN_TARGET_PROXY が含まれている場合にのみ有効です。
NumberOfProxyAuthnSchemesDWORD4+48+28HTTP プロキシ サーバーに対して認証する際の ProxyAuthnSchemes 配列の要素数です。NumberOfProxyAuthnSchemes は、AuthenticationTargetRPC_C_HTTP_AUTHN_TARGET_PROXY が含まれている場合にのみ有効です。
ProxyAuthnSchemesDWORD*8/4+56+32

HTTP プロキシ サーバーに対して認証する際に、クライアントが使用可能な認証スキームの配列へのポインターです。配列の各要素には、次の定数のいずれかを指定できます。ProxyAuthnSchemes は、AuthenticationTargetRPC_C_HTTP_AUTHN_TARGET_PROXY が含まれている場合にのみ有効です。

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

- AuthnSchemes.RPC_C_HTTP_AUTHN_SCHEME_BASIC

- AuthnSchemes.RPC_C_HTTP_AUTHN_SCHEME_DIGEST

- AuthnSchemes.RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE
- AuthnSchemes.RPC_C_HTTP_AUTHN_SCHEME_NTLM

- AuthnSchemes.RPC_C_HTTP_AUTHN_SCHEME_PASSPORT

- ProxyAuthnSchemes.RPC_C_HTTP_AUTHN_SCHEME_BASIC

- ProxyAuthnSchemes.RPC_C_HTTP_AUTHN_SCHEME_DIGEST

- ProxyAuthnSchemes.RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE
- ProxyAuthnSchemes.RPC_C_HTTP_AUTHN_SCHEME_NTLM

- ProxyAuthnSchemes.RPC_C_HTTP_AUTHN_SCHEME_PASSPORT

公式ドキュメント

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

RPC_HTTP_TRANSPORT_CREDENTIALS_V2 は、HTTP プロキシ サーバーに対する認証を可能にすることで RPC_HTTP_TRANSPORT_CREDENTIALS を拡張したものです。

解説(Remarks)

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

RpcBindingSetAuthInfoEx 関数の Unicode 版を使用する場合は、RPC_HTTP_TRANSPORT_CREDENTIALS_V2 構造体および SEC_WINNT_AUTH_IDENTITY 構造体も Unicode 版を指定する必要があり、TransportCredentialsFlags メンバーには SEC_WINNT_AUTH_IDENTITY_UNICODE を設定しなければなりません。 RpcBindingSetAuthInfoEx 関数の ANSI 版を使用する場合は、RPC_HTTP_TRANSPORT_CREDENTIALS_V2 構造体および SEC_WINNT_AUTH_IDENTITY 構造体も ANSI 版を指定する必要があり、TransportCredentialsFlags メンバーには 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_V2_W  (x64 64 / x86 36 バイト)
typedef struct RPC_HTTP_TRANSPORT_CREDENTIALS_V2_W {
    SEC_WINNT_AUTH_IDENTITY_W* TransportCredentials;
    RPC_C_HTTP_FLAGS Flags;
    RPC_C_HTTP_AUTHN_TARGET AuthenticationTarget;
    DWORD NumberOfAuthnSchemes;
    DWORD* AuthnSchemes;
    WORD* ServerCertificateSubject;
    SEC_WINNT_AUTH_IDENTITY_W* ProxyCredentials;
    DWORD NumberOfProxyAuthnSchemes;
    DWORD* ProxyAuthnSchemes;
} RPC_HTTP_TRANSPORT_CREDENTIALS_V2_W;
using System;
using System.Runtime.InteropServices;

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

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

class RPC_HTTP_TRANSPORT_CREDENTIALS_V2_W(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),
        ("ProxyCredentials", ctypes.c_void_p),
        ("NumberOfProxyAuthnSchemes", wintypes.DWORD),
        ("ProxyAuthnSchemes", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct RPC_HTTP_TRANSPORT_CREDENTIALS_V2_W {
    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,
    pub ProxyCredentials: *mut core::ffi::c_void,
    pub NumberOfProxyAuthnSchemes: u32,
    pub ProxyAuthnSchemes: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

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

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

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