ICertRequest
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
クライアントまたは仲介アプリケーションと証明書サービス (Certificate Services) との間の通信を提供します。
メソッド 7
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
証明書サービス (Certificate Services) サーバーに要求を送信します。
| Flags | INT | in | 要求の形式、要求の種類、および要求が暗号化されているかどうかを指定します。要求のエンコード方法を指定するには、次の形式属性フラグのいずれかを使用できます。
要求の種類を指定するには、次の形式値フラグのいずれかを使用できます。
| ||||||||||||||||||||||||||||||||||||||||
| strRequest | LPWSTR | in | 証明書要求を含む文字列へのポインター。Flags で CR_IN_BASE64 または CR_IN_BASE64HEADER が指定された場合、strRequest は Unicode 文字列である必要があります。 | ||||||||||||||||||||||||||||||||||||||||
| strAttributes | LPWSTR | in | 要求に対するオプションの追加属性を含む文字列へのポインター。各属性は名前と値の文字列のペアです。コロン文字が名前と値を区切り、改行文字が複数の名前と値のペアを区切ります。例:
| ||||||||||||||||||||||||||||||||||||||||
| strConfig | LPWSTR | in | 証明書サービスサーバーの有効な構成文字列を表します。この文字列は、登録サーバーの HTTPS URL、または ComputerName\CAName の形式のいずれかです。ComputerName はサーバーのネットワーク名、CAName は 証明機関の共通名です (証明書サービスのセットアップ時に入力したもの)。構成文字列名の詳細については、 ICertConfig を参照してください。 Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: 入力として HTTPS URL はサポートされていません。 | ||||||||||||||||||||||||||||||||||||||||
| pDisposition | INT* | out | 要求の処理状況の値へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。この関数が正常に完了すると、*pDisposition は次の表のいずれかの値に設定されます。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は要求の処理状況を指定します。処理状況は次のいずれかの値です。| 戻り値コード | 説明 |
|---|---|
| 要求が拒否されました | |
| 要求が失敗しました | |
| 要求が完了しませんでした | |
| 証明書が発行されました | |
| 証明書が別途発行されました | |
| 要求が送信中として受理されました |
解説(Remarks)
BASE64 形式の要求をファイルから読み取る場合は、ファイルが Unicode であることを確認するか、このメソッドで要求を送信する前に ASCII から Unicode に変換してください。
Examples
// The pointer to the interface object.
ICertRequest * pCertRequest = NULL;
// The variable for the computer\CAName.
BSTR bstrCA = NULL;
// The variable for the request.
BSTR bstrRequest = NULL;
// The variable for the attributes.
BSTR bstrAttribs = NULL;
// The variable for the disposition code.
long nDisp;
HRESULT hr;
// Initialize COM.
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// Check status.
if (FAILED(hr))
{
printf("Failed CoInitializeEx [%x]\n", hr);
goto error;
}
// Instantiate the CertConfig object.
hr = CoCreateInstance(CLSID_CCertRequest,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICertRequest,
(void **)&pCertRequest);
if (FAILED(hr))
{
printf("Failed CoCreateInstance pCertRequest [%x]\n", hr);
goto error;
}
// Specify the certification authority.
// Note: In C++, produce one backslash (\) by using two.
bstrCA = SysAllocString(L"server01\\myCAName");
// Create the request (not shown), and assign it to bstrRequest,
// for example, use ICEnroll::createPKCS10.
// Generate the attributes. In this case, no attributes
// are specified.
bstrAttribs = SysAllocString(L"");
// Submit the request.
hr = pCertRequest->Submit(CR_IN_BASE64 | CR_IN_PKCS10,
bstrRequest,
bstrAttribs,
bstrCA,
&nDisp );
if (FAILED(hr))
{
printf("Failed Submit [%x]\n", hr);
goto error;
}
else
{
// Use the disposition value as needed.
}
// Done processing.
error:
// Free BSTR values.
if (NULL != bstrCA)
SysFreeString(bstrCA);
if (NULL != bstrRequest)
SysFreeString(bstrRequest);
if (NULL != bstrAttribs)
SysFreeString(bstrAttribs);
// Clean up object resources.
if (NULL != pCertRequest)
pCertRequest->Release();
// Free COM resources.
CoUninitialize();
以前に CR_DISP_INCOMPLETE または CR_DISP_UNDER_SUBMISSION を返した可能性のある以前の要求から、証明書の処理状況を取得します。
| RequestId | INT | in | 以前に CR_DISP_INCOMPLETE または CR_DISP_UNDER_SUBMISSION を返した要求の ID。 |
| strConfig | LPWSTR | in | 証明書サービスサーバーの有効な構成文字列を表します。この文字列は、登録サーバーの HTTPS URL、または ComputerName\CAName の形式のいずれかです。ComputerName はサーバーのネットワーク名、CAName は 証明機関の共通名です (証明書サービスのセットアップ時に入力したもの)。構成文字列名の詳細については、 ICertConfig を参照してください。 Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: 入力として HTTPS URL はサポートされていません。 |
| pDisposition | INT* | out | 要求の処理状況の値へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。この関数が正常に完了すると、*pDisposition は次の表のいずれかの値に設定されます。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は要求の処理状況を指定します。処理状況は次のいずれかの値です。| 戻り値コード | 説明 |
|---|---|
| 要求が完了しませんでした | |
| 要求が失敗しました | |
| 要求が拒否されました | |
| 証明書が発行されました | |
| 証明書が別途発行されました | |
| 要求が送信中として受理されました |
解説(Remarks)
このメソッドの呼び出しが成功すると、EXITEVENT_CERTRETRIEVEPENDING イベントが生成されます。アクティブな終了モジュール (exit module) は、( ICertExit3::Notify の呼び出しによって) このイベントの通知を受け取ります。ただし、終了モジュールが ICertExit3::Initialize の呼び出し時にこのイベントを指定していた場合に限ります。
Examples
BSTR bstrCA = NULL;
long nReqID, nDisp;
// In this example, the request ID is hard-coded.
nReqID = 1234;
// Note use of two '\' in C++ to produce one '\'.
bstrCA = SysAllocString(L"server01\\myCAName");
// pCertRequest is previously instantiated ICertRequest
// object pointer. Retrieve the status for the specified request.
hr = pCertRequest->RetrievePending( nReqID, bstrCA, &nDisp );
if (FAILED(hr))
{
printf("Failed RetrievePending [%x]\n", hr);
goto error;
}
else
{
// Use the disposition value as needed...
}
// Free BSTR resource.
if ( NULL != bstrCA )
SysFreeString( bstrCA );
この要求の最後の戻りコードを取得します。これは要求の処理状況ではなく、エラーコード情報を返します。
| pStatus | INT* | out | 要求のステータスコードへのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。この関数が正常に完了すると、*pStatus は ICertRequest3::Submit、ICertRequest3::RetrievePending、または ICertRequest3::GetCACertificate の最新の呼び出しの結果コードに設定されます。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は CCertRequest3.Submit、CCertRequest3.RetrievePending または CCertRequest3.GetCACertificate の最新の呼び出しの結果コードです。解説(Remarks)
GetLastStatus によって取得される値は、 ICertRequest3::Submit、 ICertRequest3::RetrievePending、または ICertRequest3::GetCACertificate の最新の呼び出しに依存します。これらのメソッドのいずれかの呼び出しがサーバー上で失敗した場合は、GetLastStatus を呼び出してエラー番号を取得します。一部のサーバー障害 (拒否された要求など) では、メソッド呼び出しから S_OK と CR_DISP_ISSUED 以外の処理状況が返されるため、GetLastStatus を使用して失敗の具体的な原因を取得できます。これらのメソッドのいずれかの呼び出しが成功した場合、その後の GetLastStatus の呼び出しは S_OK (ゼロ) を返します。
さらに、要求の処理状況は証明書サービスのデータベースに保存され、証明機関 MMC スナップインで表示できます (「要求処理状況」列を選択します)。
Examples
HRESULT hrServer, hr;
// pCertRequest is previously instantiated
// ICertRequest object pointer.
hr = pCertRequest->GetLastStatus((LONG *) &hrServer);
if (FAILED(hr))
{
printf("Failed GetLastStatus [%x]\n", hr);
goto error;
}
else
{
// Use the HRESULT value as needed...
}
要求および後続の証明書の現在の内部要求番号を取得します。
| pRequestId | INT* | out | 要求 ID 値へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。この関数が正常に完了すると、*pRequestId は要求 ID の値に設定されます。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、要求および後続の証明書の現在の内部要求番号を指定します。証明書要求の現在の処理状況を示す、人間が読めるメッセージを取得します。
| pstrDispositionMessage | LPWSTR* | out | 処理状況メッセージを含む BSTR へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。この関数が正常に完了すると、*pstrDispositionMessage は、証明書要求の現在の処理状況を示す、人間が読めるメッセージを含む BSTR に設定されます。このメソッドを使用するには、BSTR 型の変数を作成し、その変数を NULL に設定して、この変数のアドレスを pstrDispositionMessage として渡します。BSTR の使用が終わったら、SysFreeString 関数を呼び出して解放します。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、証明書要求の現在の処理状況を示す、人間が読めるメッセージを含む文字列です。解説(Remarks)
アプリケーションは、以前の ICertRequest3::Submit または ICertRequest3::RetrievePending の呼び出しによってサーバーから取得されたメッセージを得るために、このメソッドを呼び出します。さらに、このメッセージは証明書サービスのデータベースに保存され、証明機関 MMC スナップインで表示できます (「要求処理状況メッセージ」列を選択します)。メッセージにローカライズされたテキストが含まれている場合、それは (サーバーのロケールに基づいて) サーバー上でローカライズされたものです。
Examples
#include <windows.h>
#include <stdio.h>
#include <Certcli.h>
BSTR bstrDispMsg = NULL;
// pCertRequest is previously instantiated ICertRequest object
// pointer. Retrieve the disposition message for the
// previous request.
hr = pCertRequest->GetDispositionMessage(&bstrDispMsg);
if (FAILED(hr))
{
printf("Failed GetDispositionMessage [%x]\n", hr);
goto error;
}
else
{
// Use the disposition message as needed...
}
// Done processing.
error:
// Free BSTR values.
if (NULL != bstrCA)
SysFreeString(bstrCA);
if (NULL != bstrDispMsg)
SysFreeString(bstrDispMsg);
証明書サービスサーバーの証明機関 (CA) 証明書を返します。
| fExchangeCertificate | INT | in | どの CA 証明書を返すかを指定するブール値。fExchangeCertificate が false に設定されている場合、CA の署名証明書が返されます。CA の署名証明書は、CA によって発行された証明書の署名を検証するために使用できます。 Windows Server 2003: fExchangeCertificate が true に設定されている場合、CA の交換証明書 (Exchange 証明書) が返されます。CA の交換証明書は、CA に送信される要求を暗号化するために使用できます。 Windows 7 および Windows Server 2008 R2 以降では、このパラメーターは https:// 登録中は無視され、関数が成功した場合は常に CA 交換証明書を返します。登録 Web サービスの CA 署名証明書を取得するには、Property メソッドを、ICertificationAuthority インターフェイスで、CAPropCertificate EnrollmentCAProperty 列挙値とともに使用します。 TRUE は (Microsoft のヘッダーファイルで) C/C++ プログラマー向けに 1 として定義されているのに対し、Visual Basic では True キーワードが -1 として定義されていることに注意してください。そのため、Visual Basic 開発者はこのパラメーターを TRUE に設定するには (True ではなく) 1 を使用する必要があります。ただし、このパラメーターを FALSE に設定するには、Visual Basic 開発者は 0 または False を使用できます。 | ||||||||||||
| strConfig | LPWSTR | in | 証明書サービスサーバーの有効な構成文字列を表します。この文字列は、登録サーバーの HTTPS URL、または ComputerName\CAName の形式のいずれかです。ComputerName はサーバーのネットワーク名、CAName は 証明機関の共通名です (証明書サービスのセットアップ時に入力したもの)。構成文字列名の詳細については、 ICertConfig を参照してください。 Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: 入力として HTTPS URL はサポートされていません。 | ||||||||||||
| Flags | INT | in | 返される証明書の形式を指定するには、次のフラグを使用できます。
次のフラグを形式フラグと組み合わせることで、要求された CA 証明書に完全な証明書チェーンを含めるように指定できます。それ以外の場合は、要求された CA 証明書のみが (X.509 形式で) 返されます。
| ||||||||||||
| pstrCertificate | LPWSTR* | out | 指定された形式で、証明書サービスサーバーの CA 証明書を含む BSTR へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。このメソッドが正常に完了すると、*pstrCertificate は CA 証明書を含む BSTR に設定されます。このメソッドを使用するには、BSTR 型の変数を作成し、その変数を NULL に設定して、この変数のアドレスを pstrCertificate として渡します。
*pstrCertificate の使用が終わったら、SysFreeString 関数を呼び出して解放します。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
指定された形式での、証明書サービスサーバーの CA 証明書。解説(Remarks)
管理タスクは DCOM を使用します。以前のバージョンの Certadm.h で定義されているこのインターフェイスメソッドを呼び出すコードは、クライアントとサーバーの両方が同じ Windows オペレーティングシステムを実行している限り、Windows ベースのサーバー上で動作します。
要求に対して発行された証明書を、X.509 証明書として、またはオプションで Public Key Cryptography Standards (PKCS) にパッケージ化して返します。
| Flags | INT | in | 形式、および完全な証明書チェーンを含めるかどうかを指定するフラグ。 返される証明書の形式は、次のフラグのいずれかにできます。
次のフラグを形式フラグと組み合わせることができます。
たとえば、C++ で完全な証明書チェーンを含むバイナリ証明書を取得するには、次のように記述します。 | ||||||||||||||
| pstrCertificate | LPWSTR* | out | 指定された形式で証明書を含む BSTR へのポインター。 このメソッドを使用するときは、BSTR 型の変数を作成し、その変数を NULL に設定して、この変数のアドレスを pstrCertificate として渡します。pstrCertificate が指す証明書の使用が終わったら、SysFreeString 関数を呼び出して解放します。 |
戻り値
メソッドが *pstrCertificate を要求の証明書を含む BSTR に設定した場合、S_OK を返します。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
アプリケーションは、以前の ICertRequest3::Submit または ICertRequest3::RetrievePending の呼び出しによって発行された証明書を取得するために、このメソッドを呼び出します。
Examples
次の例は、証明書の取得を示しています。
#include <windows.h>
#include <stdio.h>
#include <Certcli.h>
HRESULT main()
{
// Pointer to interface object.
ICertRequest * pCertRequest = NULL;
// Variable for COMPUTER\CANAME.
BSTR bstrCA = NULL;
// Variable for CA Certificate.
BSTR bstrCACert = NULL;
HRESULT hr;
// Initialize COM.
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// Check status.
if (FAILED(hr))
{
printf("Failed CoInitializeEx [%x]\n", hr);
goto error;
}
// Instantiate the CertConfig object.
hr = CoCreateInstance(CLSID_CCertRequest,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICertRequest,
(void **)&pCertRequest);
if (FAILED(hr))
{
printf("Failed CoCreateInstance pCertRequest [%x]\n", hr);
goto error;
}
// Note use of two backslashes (\\) in C++
// to produce one backslash (\).
bstrCA = SysAllocString(L"server01\\myCAName");
// Retrieve the CA certificate.
hr = pCertRequest->GetCACertificate(FALSE,
bstrCA,
CR_OUT_BASE64,
&bstrCACert);
if (FAILED(hr))
{
printf("Failed GetCACertificate [%x]\n", hr);
goto error;
}
else
{
// Use CA Certificate as needed.
}
// Done processing.
error:
// Free BSTR values.
if (NULL != bstrCA)
SysFreeString(bstrCA);
if (NULL != bstrCACert)
SysFreeString(bstrCACert);
// Clean up object resources.
if (NULL != pCertRequest)
pCertRequest->Release();
// Free COM resources.
CoUninitialize();
return hr;
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ICertRequest "{014E4840-5523-11D0-8812-00A0C903B83C}" #usecom global ICertRequest IID_ICertRequest "{}" #comfunc global ICertRequest_Submit 7 int,wstr,wstr,wstr,var #comfunc global ICertRequest_RetrievePending 8 int,wstr,var #comfunc global ICertRequest_GetLastStatus 9 var #comfunc global ICertRequest_GetRequestId 10 var #comfunc global ICertRequest_GetDispositionMessage 11 var #comfunc global ICertRequest_GetCACertificate 12 int,wstr,int,var #comfunc global ICertRequest_GetCertificate 13 int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_ICertRequest "{014E4840-5523-11D0-8812-00A0C903B83C}" #usecom global ICertRequest IID_ICertRequest "{}" #comfunc global ICertRequest_Submit 7 int,wstr,wstr,wstr,sptr #comfunc global ICertRequest_RetrievePending 8 int,wstr,sptr #comfunc global ICertRequest_GetLastStatus 9 sptr #comfunc global ICertRequest_GetRequestId 10 sptr #comfunc global ICertRequest_GetDispositionMessage 11 sptr #comfunc global ICertRequest_GetCACertificate 12 int,wstr,int,sptr #comfunc global ICertRequest_GetCertificate 13 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。