Win32 API 日本語リファレンス
ホームSecurity.Cryptography.Certificates › IEnumCERTVIEWEXTENSION

IEnumCERTVIEWEXTENSION

COMIDispatch (デュアル)
IDispatch を実装(デュアルインターフェース)。HSP では comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。
IIDe7dd1466-7653-11d1-9bde-00c04fb683fa継承元IDispatch呼び出し名前(IDispatch) または vtbl自前メソッド開始 vtbl7

公式ドキュメント

行列挙シーケンスの現在の行に対応する証明書拡張データを格納する、拡張列挙シーケンスを表します。

メソッド 7

vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。

vtbl 7 HRESULT Next(INT* pIndex)

拡張列挙シーケンス内の次の拡張へ移動します。

pIndexINT*inout参照される次の拡張のインデックス値を格納する変数へのポインター。列挙する拡張がこれ以上ない場合、この変数には –1 が設定されます。pIndexNULL の場合、このメソッドは失敗します。

戻り値

C++

メソッドが成功した場合、S_OK を返し、次の拡張を参照している状態になります。拡張がこれ以上ない場合、S_FALSE が返され、pIndex パラメーターには –1 の値が設定されます。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、拡張列挙シーケンスが現在参照している拡張のインデックス値です。列挙する拡張がこれ以上ない場合、戻り値は –1 です。

解説(Remarks)

このメソッドが正常に完了すると、拡張の名前、フラグ、値には 次のメソッドを通じてアクセスできます:

LONG  Index;
LONG  nCount;

// 拡張の数を求める
nCount = 0;
// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
while (S_OK == pEnumExt->Next(&Index))
{
    nCount++;
}
printf("Number of extensions is %d\n", nCount);
vtbl 8 HRESULT GetName(LPWSTR* pstrOut)

拡張列挙シーケンス内の現在の拡張の名前を取得します。

pstrOutLPWSTR*inout拡張の名前を格納する BSTR 型の値へのポインター。

戻り値

C++

メソッドが成功した場合、S_OK を返し、pstrOut パラメーターに拡張の名前が設定されます。

このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、この変数のアドレスを pstrOut として渡します。BSTR の使用が終わったら、SysFreeString 関数を呼び出して解放してください。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、拡張の名前を格納する String です。

解説(Remarks)

この関数は、拡張列挙シーケンスが現在参照している 拡張の名前を取得するために使用します。

拡張列挙シーケンスが有効な拡張を参照していない場合、GetName は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください:

BSTR  bstrExtName = NULL;

// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
hr = pEnumExt->GetName(&bstrExtName);
if (S_OK == hr)
    printf("Extension name is: %ws\n", bstrExtName);
else
    printf("GetName failed: %x\n", hr);

// 完了したらメモリを解放する
if (NULL != bstrExtName)
    SysFreeString(bstrExtName);
vtbl 9 HRESULT GetFlags(INT* pFlags)

拡張列挙シーケンス内の現在の拡張のポリシーフラグと発生元フラグを取得します。

pFlagsINT*inout拡張のポリシーフラグと発生元フラグを格納する LONG 型へのポインター。pFlags パラメーターが NULL に設定されている場合、このメソッドは失敗します。

戻り値

C++

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、拡張のポリシー値と発生元値を表します。

解説(Remarks)

このメソッドは、拡張列挙シーケンスが現在参照している 拡張のポリシーフラグと発生元フラグを取得するために使用します。

ポリシーフラグは証明書拡張に関する情報を提供し、ポリシーモジュールによって設定できます。

発生元フラグは、証明書拡張を設定したモジュールを示し、サーバーエンジンによってのみ設定されます。

1 つの拡張から 1 つ以上のポリシーフラグを返すことができます。定義済みのポリシーフラグは次のとおりです。

ポリシーフラグの値 説明
EXTENSION_CRITICAL_FLAG これはクリティカルな拡張です。
EXTENSION_DISABLE_FLAG 拡張は使用されません。
 

次の発生元フラグのいずれかを返すこともできます。

発生元フラグの値 説明
EXTENSION_ORIGIN_REQUEST 拡張は、PKCS #10 要求の szOID_CERT_EXTENSIONS (1.3.6.1.4.1.311.2.1.14) 属性または szOID_RSA_certExtensions (1.2.840.113549.1.9.14) 属性に格納された拡張の配列から抽出されました。
EXTENSION_ORIGIN_POLICY ポリシーモジュールが拡張を設定しました。
EXTENSION_ORIGIN_ADMIN 管理者が拡張を設定しました。
EXTENSION_ORIGIN_SERVER サーバーエンジンが拡張を設定しました。
EXTENSION_ORIGIN_RENEWALCERT 拡張は、PKCS #10 更新要求の szOID_RENEWAL_CERTIFICATE (1.3.6.1.4.1.311.13.1) 属性に格納された証明書から抽出されました。
EXTENSION_ORIGIN_IMPORTEDCERT 拡張は、インポートされた証明書から抽出されました (証明書は ICertAdmin::ImportCertificate に渡されました)。
EXTENSION_ORIGIN_PKCS7 拡張は、PKCS #7 要求の szOID_CERT_EXTENSIONS (1.3.6.1.4.1.311.2.1.14) 属性または szOID_RSA_certExtensions (1.2.840.113549.1.9.14) 属性に格納された拡張の配列から抽出されました。
 

戻り値でどのフラグが設定されているかを判別しやすくするために、定義済みのマスクが用意されています。用意されているマスクは次のとおりです。

マスクの値 説明
EXTENSION_POLICY_MASK この値 (0x0000FFFF) は、ポリシーフラグを調べるために使用します。
EXTENSION_ORIGIN_MASK この値 (0x000F0000) は、発生元フラグを調べるために使用します。
 

拡張列挙シーケンスが有効な拡張を参照していない場合、GetFlags は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください:

HRESULT  hr;
LONG     ExtFlags;

// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
hr = pEnumExt->GetFlags(&ExtFlags);
if (S_OK != hr)
    printf("Failed GetFlags - %x\n", hr);
else
{
    LONG ExtPol, ExtOrig;

    ExtPol = ExtFlags & EXTENSION_POLICY_MASK;
    if (ExtPol & EXTENSION_CRITICAL_FLAG)
        printf("The extension is critical\n");
    if (ExtPol & EXTENSION_DISABLE_FLAG )
        printf("The extension is disabled\n");

    ExtOrig = ExtFlags & EXTENSION_ORIGIN_MASK;
    switch (ExtOrig)
    {
        case EXTENSION_ORIGIN_REQUEST:
            printf("Extension originated by PKCS #10 Request\n");
            break;
        case EXTENSION_ORIGIN_POLICY:
            printf("Extension originated by Policy\n");
            break;
        case EXTENSION_ORIGIN_ADMIN:
            printf("Extension originated by Admin\n");
            break;
        case EXTENSION_ORIGIN_SERVER:
            printf("Extension originated by Server\n");
            break;
        case EXTENSION_ORIGIN_RENEWALCERT:
            printf("Extension originated by Renewal Request\n");
            break;
        case EXTENSION_ORIGIN_IMPORTEDCERT:
            printf("Extension originated by an imported "
                "certificate\n");
            break;
        case EXTENSION_ORIGIN_PKCS7:
            printf("Extension originated by PKCS #7 Request\n");
            break;
        default:
            printf("Unknown extension origin\n");
            break;
    }
}
vtbl 10 HRESULT GetValue(CERT_PROPERTY_TYPE Type, ENUM_CERT_COLUMN_VALUE_FLAGS Flags, VARIANT* pvarValue)

拡張列挙シーケンス内の現在の拡張の値を取得します。

TypeCERT_PROPERTY_TYPEin

返されるデータのデータ型。このパラメーターを使用して、拡張データを返す前にデコードするよう指定できます。PROPTYPE_BINARY が指定された場合、データはデコードされず、代わりに未加工の形式で返されます。

次のいずれかの値を指定します。

意味
PROPTYPE_BINARY
拡張の値はそのまま取得され、必要に応じて ASN.1 でエンコードされます。
PROPTYPE_DATE
拡張の値は日付/時刻として返されます。
PROPTYPE_LONG
拡張の値は符号付き long として返されます。
PROPTYPE_STRING
拡張の値は IA5 文字列として ASN.1 エンコードされます。
FlagsENUM_CERT_COLUMN_VALUE_FLAGSin

返されるデータの出力形式を示すフラグ。このパラメーターには、次のいずれかの値を指定できます。

意味
CV_OUT_BASE64
BEGIN/END なしの BASE64
CV_OUT_BASE64HEADER
BEGIN CERTIFICATE と END CERTIFICATE を含む BASE64
CV_OUT_BASE64REQUESTHEADER
BEGIN NEW CERTIFICATE REQUEST と END NEW CERTIFICATE REQUEST を含む BASE64
CV_OUT_BINARY
バイナリ
CV_OUT_HEX
16 進数文字列
CV_OUT_HEXADDR
アドレス/オフセット付きの 16 進数文字列
CV_OUT_HEXASCII
ASCII 付きの 16 進数文字列
CV_OUT_HEXASCIIADDR
ASCII とアドレス/オフセット付きの 16 進数文字列
pvarValueVARIANT*inout現在参照されている拡張のデータを格納する VARIANT 型の値へのポインター。pvarValue パラメーターが NULL の場合、このメソッドは失敗します。この関数が正常に完了すると、pvarValue には拡張列挙シーケンスが現在参照している拡張データが格納されます。呼び出し元は、VariantClear を、pvarValue 内のデータの使用が終わったら呼び出す責任があります。

戻り値

C++

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、拡張内のデータを表す Variant です。

解説(Remarks)

このメソッドは、拡張列挙シーケンスが現在参照している 拡張内のデータを取得するために使用します。

拡張列挙シーケンスが有効な拡張を参照していない場合、GetValue は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください:

このメソッドは、拡張列挙シーケンスが ICertView::EnumCertViewColumn メソッドの呼び出しによって取得された場合、そのメソッドで取得した列挙シーケンスにはスキーマ情報のみが含まれるため、失敗します。

VARIANT     var;
LONG        Index;
HRESULT     hr;
SYSTEMTIME  systime;

VariantInit(&var);

// 各拡張を列挙する
// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
while (S_OK == pEnumExt->Next(&Index))
{
    hr = pEnumExt->GetValue(PROPTYPE_BINARY, CV_OUT_HEX, &var);
    if (FAILED(hr))
    {
        printf("Failed GetValue - %x\n", hr);
        break;
    }
    switch(var.vt)
    {
        case VT_EMPTY:
            printf("VT_EMPTY\n");
            break;
        case VT_BSTR:
            printf("BSTR:%ws\n", var.bstrVal);
            break;
        case VT_DATE:
            VariantTimeToSystemTime(var.date, &systime);
            printf("%d.%d.%d %02d:%02d:%02d\n",
                   systime.wMonth,
                   systime.wDay,
                   systime.wYear,
                   systime.wHour,
                   systime.wMinute,
                   systime.wSecond );
            break;
        case VT_I2:
            printf("%d\n", var.iVal);
            break;
        case VT_I4:
            printf("%d\n", var.lVal);
            break;
        default:
            printf("type is:%i\n", var.vt);
            break;
    }
}
// リソースを解放する
VariantClear( &var );
vtbl 11 HRESULT Skip(INT celt)

拡張列挙シーケンス内で指定した数の拡張をスキップします。

celtINTinスキップする拡張の数。celt パラメーターに正の値を指定すると、拡張列挙シーケンスはシーケンス内を前方へスキップします。celt パラメーターに負の値を指定すると、拡張列挙シーケンスはシーケンス内を後方へスキップします。

戻り値

VB

メソッドが成功した場合、S_OK を返します。

戻り値が E_INVALIDARG の場合、celt パラメーターの負の値によって拡張列挙シーケンスのインデックスがゼロ未満になったことを示します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

このメソッドが正常に完了したら、 IEnumCERTVIEWEXTENSION::Next メソッドを呼び出して、拡張列挙シーケンス内の現在の拡張を参照します。拡張の名前、フラグ、値には、次のメソッドを通じてアクセスできます:

拡張列挙シーケンスは、ゼロから始まる内部インデックスを保持します。Skip メソッドを呼び出すと、このインデックスは celt パラメーターで指定された拡張の数だけ増加または減少します。

celt パラメーターの負の値によってインデックスがゼロ未満になった場合、以降の IEnumCERTVIEWEXTENSION::Next の呼び出しの動作は未定義となります。

celt パラメーターの正の値によってインデックスが列挙シーケンスの最後の拡張を超えた場合、以降の IEnumCERTVIEWEXTENSION::Next メソッドの呼び出しは失敗します。

HRESULT  hr;
LONG     Index;

// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
// 次の 5 個の拡張をスキップする
hr = pEnumExt->Skip(5);
if (S_OK == hr)
{
    // 次の拡張を取得する
    hr = pEnumExt->Next(&Index);
    if (S_OK == hr)
    {
        // 必要に応じてこの拡張を使用する
    }
}
vtbl 12 HRESULT Reset()

拡張列挙シーケンスの先頭へ移動します。

戻り値

VB

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

このメソッドが正常に完了したら、 IEnumCERTVIEWEXTENSION::Next メソッドを呼び出して、拡張列挙シーケンス内の最初の拡張を参照します。

拡張の名前、フラグ、値には、次のメソッドを使用してアクセスできます:

HRESULT  hr;
LONG     Index;

// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
hr = pEnumExt->Reset();
if (S_OK != hr)
    printf("Unable to reset pEnumExt - %x\n", hr);
    // 適切なエラーハンドラーを呼び出して終了処理を行う
else
{
    // 再び拡張の先頭にリセットする
    while (S_OK == pEnumExt->Next(&Index))
    {
        // 必要に応じて各拡張を使用する
    }
}
vtbl 13 HRESULT Clone(IEnumCERTVIEWEXTENSION** ppenum)

拡張列挙シーケンスのコピーを作成します。

ppenumIEnumCERTVIEWEXTENSION**outIEnumCERTVIEWEXTENSION 型のポインターへのポインター。ppenum パラメーターが NULL の場合、このメソッドは失敗します。

戻り値

C++

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、複製された拡張列挙シーケンスオブジェクトです。

解説(Remarks)

拡張列挙シーケンスオブジェクトは、IEnumCERTVIEWROW::EnumCertViewExtension メソッドの呼び出しによって取得されます。

IEnumCERTVIEWEXTENSION * pEnumExt2 = NULL;
HRESULT                  hr;

// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
hr = pEnumExt->Clone(&pEnumExt2);
if (S_OK != hr)
    printf("Unable to clone IEnumCERTVIEWEXTENSION\n");
else
{
    // 必要に応じて複製したオブジェクトを使用する
    //...
}
// 複製したオブジェクトの使用が終わったら、メモリを解放する
if (NULL != pEnumExt2)
    pEnumExt2->Release();
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IEnumCERTVIEWEXTENSION "{E7DD1466-7653-11D1-9BDE-00C04FB683FA}"
#usecom global IEnumCERTVIEWEXTENSION IID_IEnumCERTVIEWEXTENSION "{}"
#comfunc global IEnumCERTVIEWEXTENSION_Next      7 var
#comfunc global IEnumCERTVIEWEXTENSION_GetName   8 var
#comfunc global IEnumCERTVIEWEXTENSION_GetFlags  9 var
#comfunc global IEnumCERTVIEWEXTENSION_GetValue  10 int,int,var
#comfunc global IEnumCERTVIEWEXTENSION_Skip      11 int
#comfunc global IEnumCERTVIEWEXTENSION_Reset     12
#comfunc global IEnumCERTVIEWEXTENSION_Clone     13 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。
; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。