ICertAdmin
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
適切に承認されたクライアントに管理機能を提供します。
メソッド 10
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
証明機関(CA)のキーに対して証明書を検証し、その証明書が失効していないことを確認します。このメソッドは ICertAdmin インターフェイスで最初に定義されました。
| strConfig | LPWSTR | in | CA の有効な構成文字列を COMPUTERNAME\CANAME の形式で表します。COMPUTERNAME は Certificate Services サーバーのネットワーク名、CANAME は Certificate Services のセットアップ時に入力した証明機関の共通名です。構成文字列名については、 ICertConfig を参照してください。 重要 IsValidCertificate は、構成文字列が変更されても内部キャッシュをクリアしません。CA の構成文字列を変更する場合は、新しい ICertAdmin オブジェクトをインスタンス化し、新しい構成文字列でこのメソッドを再度呼び出す必要があります。
|
| strSerialNumber | LPWSTR | in | 確認対象の証明書を識別するシリアル番号を指定します。文字列では、シリアル番号を偶数桁の 16 進数で指定する必要があります。必要に応じて、桁数を偶数にするために先頭に 0 を付加できます。先頭に付加できる 0 は 1 つまでです。 |
| pDisposition | INT* | out | 処理状況の値を受け取る LONG へのポインターです。 |
戻り値
C++
メソッドが成功し、pDisposition パラメーターが次のいずれかの値に設定された場合、メソッドは S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は証明書の処理状況を指定します。この値は次のいずれかの値です。(これらの値は Certadm.h で定義されています。)| リターンコード | 説明 |
|---|---|
| 呼び出しが完了しませんでした。 | |
| 呼び出しが失敗しました。 | |
| 証明書は失効しています。 | |
| 証明書はまだ有効です。 | |
| 証明書は発行されていません。 | |
| 証明書は保留中です。 |
解説(Remarks)
このメソッドは、証明書が発行済みで現在失効していないかどうかのみを判断します。現在の日時が証明書の有効期間(証明書の NotBefore プロパティおよび NotAfter プロパティ)内にあるかどうかは確認しません。このメソッドを使用するアプリケーションは、証明書の有効期限の確認も行う必要があります。
管理タスクは DCOM を使用します。以前のバージョンの Certadm.h で定義されているこのインターフェイスのメソッドを呼び出すコードは、クライアントとサーバーが両方とも同じ Windows オペレーティングシステムを実行している限り、Windows ベースのサーバーで動作します。
例
BSTR bstrCA = NULL; // Machine\CAName
BSTR bstrSerial = NULL; // Contains the certificate
// serial number
long nDisp; // Contains the certificate
// disposition
HRESULT hr;
bstrCA = SysAllocString(L"<COMPUTERNAMEHERE>\\<CANAMEHERE>");
bstrSerial = SysAllocString(L"<SERIALNUMBERHERE>");
if (NULL == bstrCA || NULL == bstrSerial)
{
printf("Memory allocation failed\n");
goto error;
}
// Determine whether the certificate is valid.
// pCertAdmin is a previously instantiated ICertAdmin
// object pointer.
hr = pCertAdmin->IsValidCertificate(bstrCA, bstrSerial, &nDisp);
if (FAILED(hr))
{
printf("Failed IsValidCertificate [%x]\n", hr);
goto error;
}
// Use nDisp as needed.
// Done processing.
error:
// Free BSTR values.
if (NULL != bstrCA)
SysFreeString(bstrCA);
if (NULL != bstrSerial)
SysFreeString(bstrSerial);
証明書が失効した理由を返します。このメソッドは ICertAdmin インターフェイスで最初に定義されました。
| pReason | INT* | out | 失効理由を受け取る変数へのポインターです。 |
戻り値
C++
メソッドが成功すると、メソッドは S_OK を返し、pReason パラメーターは次の表に示すいずれかの値に設定されます。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
証明書が失効した理由を指定する値を返します。値は次の失効理由コード(Wincrypt.h で定義)のいずれかになります。| リターンコード | 説明 |
|---|---|
| 失効の理由が指定されていません。 | |
| サブジェクトの秘密キー、または証明書で検証されたサブジェクトのその他の側面が、侵害されていることが判明している、またはその疑いがあります。 | |
| CA の秘密キー、または証明書で検証された CA のその他の側面が、侵害されていることが判明している、またはその疑いがあります。 | |
| 証明書内のサブジェクト名またはその他の情報が変更されましたが、秘密キーが侵害されたと疑う理由はありません。 | |
| 証明書は置き換えられましたが、秘密キーが侵害されたと疑う理由はありません。 | |
| 証明書は発行された目的にはもはや必要ありませんが、秘密キーが侵害されたと疑う理由はありません。 | |
| 証明書は保留状態にされています。 |
解説(Remarks)
GetRevocationReason を呼び出す前に、 IsValidCertificate メソッドを呼び出して証明書の処理状況を取得します。GetRevocationReason を呼び出すには、この事前の呼び出しから証明書の処理状況 CA_DISP_REVOKED を受け取り、証明書が失効していることが示されている必要があります。IsValidCertificate の呼び出しによって、失効理由を取得する対象の証明書が特定されます。
管理タスクは DCOM を使用します。以前のバージョンの Certadm.h で定義されているこのインターフェイスのメソッドを呼び出すコードは、クライアントとサーバーが両方とも同じ Windows オペレーティングシステムを実行している限り、Windows ベースのサーバーで動作します。
例
// The value for nDisp was set by
// a call to ICertAdmin2::IsValidCertificate.
if (CA_DISP_REVOKED == nDisp)
{
// Variable to contain revocation reason.
long nReason;
// Retrieve the revocation reason.
hr = pCertAdmin->GetRevocationReason(&nReason);
if (FAILED(hr))
{
printf("Failed GetRevocationReason [%x]\n", hr);
goto error;
}
else
printf("Revocation reason = %d\n", nReason );
}
指定した日付または即時に証明書を失効させます。このメソッドは ICertAdmin インターフェイスで最初に定義されました。
| strConfig | LPWSTR | in | 証明機関(CA)サーバーの有効な構成文字列を COMPUTERNAME\CANAME の形式で表します。COMPUTERNAME は Certificate Services サーバーのネットワーク名、CANAME は Certificate Services のセットアップ時に入力した証明機関の共通名です。構成文字列名については、ICertConfig を参照してください。 重要 RevokeCertificate は、構成文字列が変更されても内部キャッシュをクリアしません。CA の構成文字列を変更する場合は、新しい ICertAdmin オブジェクトをインスタンス化し、新しい構成文字列でこのメソッドを再度呼び出す必要があります。
|
| strSerialNumber | LPWSTR | in | 失効させる証明書を識別するシリアル番号を指定します。文字列では、シリアル番号を偶数桁の 16 進数で指定する必要があります。必要に応じて、桁数を偶数にするために先頭に 0 を付加できます。ただし、先頭に付加できる 0 は 1 つまでです。 |
| Reason | INT | in | 失効の理由を指定します。 次の値(Wincrypt.h で定義)が サポートされている理由コードです。 CRL_REASON_UNSPECIFIED (0)CRL_REASON_KEY_COMPROMISE (1)CRL_REASON_CA_COMPROMISE (2)CRL_REASON_AFFILIATION_CHANGED (3)CRL_REASON_SUPERSEDED (4)CRL_REASON_CESSATION_OF_OPERATION (5)CRL_REASON_CERTIFICATE_HOLD (6)CRL_REASON_CERTIFICATE_HOLD 失効理由コードで失効させた証明書は、Reason の値として MAXDWORD を指定して RevokeCertificate を呼び出すことで復元できます。CRL_REASON_CERTIFICATE_HOLD 以外の理由コードで失効させた証明書は復元できないことに注意してください。 |
| Date | DOUBLE | in | 失効が有効になる日付を協定世界時(グリニッジ標準時)で指定します。値 0 は現在の協定世界時を示し、証明書は即時に失効します。Date の値は、(証明機関 MMC スナップインで)失効した証明書の [有効な失効日] 列に表示されます。 |
戻り値
VB
メソッドが成功すると、メソッドは S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドは同じ証明書に対して複数回呼び出すことができ、これにより有効な失効日と失効理由を変更できます。
現在失効している証明書の理由コードが CRL_REASON_CERTIFICATE_HOLD である場合、理由コード(Reason パラメーター)の値として MAXDWORD(Winnt.h で定義)を指定して RevokeCertificate を呼び出すことで、その証明書を復元できます。復元後、その証明書は今後の CRL には表示されません。
管理タスクは DCOM を使用します。以前のバージョンの Certadm.h で定義されているこのインターフェイスのメソッドを呼び出すコードは、クライアントとサーバーが両方とも同じ Windows オペレーティングシステムを実行している限り、Windows ベースのサーバーで動作します。
例
BSTR bstrCA = NULL;
BSTR bstrSerial = NULL; // certificate serial number
long nReason;
DATE RevokeDate; // revocation date
SYSTEMTIME st;
bstrSerial = SysAllocString(L"<SERIALNUMBERHERE>");
bstrCA = SysAllocString(L"<COMPUTERNAMEHERE>\\<CANAMEHERE>");
if (NULL == bstrCA || NULL == bstrSerial)
{
printf("Memory allocation failed\n");
goto error;
}
nReason = CRL_REASON_AFFILIATION_CHANGED; // Defined
// in Wincrypt.h
// Specify when the cert should be revoked.
// Note: To revoke immediately, set RevokeDate to zero.
// This example sets the revoke date to noon on 1/1/2001.
// Zero out values first (avoids setting minutes, seconds,
// and so on).
memset(&st, 0, sizeof(SYSTEMTIME));
st.wYear = 2001;
st.wMonth = 1; // Jan
st.wDay = 1; // 1st day of month
st.wHour = 12; // Noon
// Place the date in the required format.
if (!SystemTimeToVariantTime(&st, &RevokeDate))
{
printf("Unable to convert time.\n");
goto error;
}
// Revoke the certificate.
// pCertAdmin is a previously instantiated ICertAdmin object.
hr = pCertAdmin->RevokeCertificate( bstrCA,
bstrSerial,
nReason,
RevokeDate );
if (FAILED(hr))
{
printf("Failed RevokeCertificate. [%x]\n", hr);
goto error;
}
else
printf("Certificate %ws revoked.\n", bstrSerial );
// Done processing.
error:
// Free resources.
if (bstrSerial)
SysFreeString( bstrSerial );
if (bstrCA)
SysFreeString( bstrCA );
指定した保留中の証明書要求に属性を設定します。このメソッドは ICertAdmin インターフェイスで最初に定義されました。
| strConfig | LPWSTR | in | 証明機関(CA)サーバーの有効な構成文字列を COMPUTERNAME\CANAME の形式で表します。COMPUTERNAME は Certificate Services サーバーのネットワーク名、CANAME は Certificate Services のセットアップ時に入力した証明機関の共通名です。構成文字列名については、 ICertConfig を参照してください。 重要 SetRequestAttributes は、構成文字列が変更されても内部キャッシュをクリアしません。CA の構成文字列を変更する場合は、新しい ICertAdmin オブジェクトをインスタンス化し、新しい構成文字列でこのメソッドを再度呼び出す必要があります。
| ||||
| RequestId | INT | in | 属性を受け取る要求の ID を指定します。 | ||||
| strAttributes | LPWSTR | in | 属性データを指定します。各属性は名前と値の文字列のペアです。コロン文字が名前と値を区切り、改行文字が複数の名前と値のペアを区切ります。次に例を示します。
Certificate Services は属性名を解析するとき、スペース、ハイフン(マイナス記号)、および大文字と小文字の違いを無視します。たとえば、AttributeName1、Attribute Name1、Attribute-name1 はすべて同等です。属性値については、Certificate Services は先頭と末尾の空白を無視します。 注意 属性名の最大長は、NULL 以外の文字で 127 文字です。属性値の最大長は、NULL 以外の文字で 4,096 文字です。
|
戻り値
VB
メソッドが成功すると、メソッドは S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
SetRequestAttributes を呼び出して追加または更新した属性は、証明書要求に関連付けられた初期の未解析の属性文字列を変更しません。証明書要求の未解析の属性文字列は、証明書が要求された後は変更できません( ICertRequest::Submit メソッドを使用すると、証明書の要求時に属性を指定できます)。
初期の未解析の要求属性文字列を表示するには、証明機関 MMC スナップインを使用できます。
解析済みの属性を表示すると、SetRequestAttributes の呼び出しによる変更も確認できます。
解析済みの属性を表示するには
- 証明機関 MMC スナップインを開きます。
- [保留中の要求] フォルダーを開きます。
- 要求を右クリックし、[すべてのタスク] をポイントして、[属性/拡張の表示] をクリックします。
管理タスクは DCOM を使用します。以前のバージョンの Certadm.h で定義されているこのインターフェイスのメソッドを呼び出すコードは、クライアントとサーバーが両方とも同じ Windows オペレーティングシステムを実行している限り、Windows ベースのサーバーで動作します。
例
BSTR bstrAttribs = NULL;
BSTR bstrCA = NULL;
long nReqID; // request ID
// Specify the attributes.
// For example, "AttName1:AttValue1\nAttName2:AttValue2".
bstrAttribs = SysAllocString(L"<ATTRIBUTESHERE>");
if (NULL == bstrAttribs)
{
printf("Memory allocation failed for bstrAttribs.\n");
goto error;
}
bstrCA = SysAllocString(L"<COMPUTERNAMEHERE>\\<CANAMEHERE>");
if (NULL == bstrCA)
{
printf("Memory allocation failed for bstrCA.\n");
goto error;
}
// Request ID to receive the attributes.
nReqID = <REQUESTIDHERE>;
// Add these attributes to the certificate.
// pCertAdmin is a previously instantiated
// ICertAdmin object pointer.
hr = pCertAdmin->SetRequestAttributes( bstrCA,
nReqID,
bstrAttribs );
if (FAILED(hr))
printf("Failed SetRequestAttributes [%x]\n", hr);
else
printf("SetRequestAttributes succeeded\n");
// Done processing.
error:
if (bstrAttribs)
SysFreeString(bstrAttribs);
if (bstrCA)
SysFreeString(bstrCA);
// Free other resources.
証明書要求に応じて発行される証明書に新しい拡張を追加します。このメソッドは ICertAdmin インターフェイスで最初に定義されました。
| strConfig | LPWSTR | in | 証明機関(CA)サーバーの有効な構成文字列を COMPUTERNAME\CANAME の形式で表します。COMPUTERNAME は Certificate Services サーバーのネットワーク名、CANAME は Certificate Services のセットアップ時に入力した証明機関の共通名です。構成文字列名については、 ICertConfig を参照してください。 重要 SetCertificateExtension は、構成文字列が変更されても内部キャッシュをクリアしません。CA の構成文字列を変更する場合は、新しい ICertAdmin オブジェクトをインスタンス化し、新しい構成文字列でこのメソッドを再度呼び出す必要があります。
| ||||||||||
| RequestId | INT | in | 証明書要求の ID を指定します。 | ||||||||||
| strExtensionName | LPWSTR | in | 設定する拡張のオブジェクト識別子(OID)を指定します。文字列の長さは、NULL 以外の文字で 31 文字以下である必要があります。 | ||||||||||
| Type | CERT_PROPERTY_TYPE | in | 設定する拡張の種類を指定します。Type パラメーターは、pvarValue パラメーターのデータ型と一致している必要があります。このデータ型は、VARIANT 構造体の vt フィールドに設定されます。 このパラメーターには、次のいずれかの値を指定できます。
| ||||||||||
| Flags | INT | in | 設定する拡張のフラグを指定します。フラグを設定しない場合は、値 0 を使用します。これらのフラグは、ビットごとの OR 演算で組み合わせることができ、ポリシープライベート拡張フラグ(EXTENSION_POLICY_MASK フィールドの上位 8 ビット)と組み合わせることもできます。 注意 Flags パラメーターが EXTENSION_DISABLE_FLAG に設定されている場合、拡張はサーバーログで無効になり、証明書には追加されません。
| ||||||||||
| pvarValue | VARIANT* | in | 拡張に関連付けられる値を指定します。 |
戻り値
VB
メソッドが成功すると、メソッドは S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
管理タスクは DCOM を使用します。以前のバージョンの Certadm.h で定義されているこのインターフェイスのメソッドを呼び出すコードは、クライアントとサーバーが両方とも同じ Windows オペレーティングシステムを実行している限り、Windows ベースのサーバーで動作します。
保留中の指定した証明書要求を拒否します。
| strConfig | LPWSTR | in | 証明機関(CA)の有効な構成文字列を COMPUTERNAME\CANAME の形式で表します。COMPUTERNAME は Certificate Services サーバーのネットワーク名、CANAME は Certificate Services のセットアップ時に入力した証明機関の共通名です。構成文字列については、ICertConfig を参照してください。 重要 DenyRequest は、構成文字列が変更されても内部キャッシュをクリアしません。CA の構成文字列を変更する場合は、新しい ICertAdmin オブジェクトをインスタンス化し、新しい構成文字列でこのメソッドを再度呼び出す必要があります。
|
| RequestId | INT | in | 拒否する保留中の要求の ID を指定します。 |
解説(Remarks)
管理タスクは DCOM を使用します。以前のバージョンの Certadm.h で定義されているこのインターフェイスのメソッドを呼び出すコードは、クライアントとサーバーが両方とも同じ Windows オペレーティングシステムを実行している限り、Windows ベースのサーバーで動作します。
例
次の例では、必要な変数を宣言し、COM を初期化して、CertAdmin クラスのインスタンスを作成します。次に DenyRequest を呼び出し、成功または失敗を画面に出力します。最後にリソースを解放します。
// Pointer to an interface object.
ICertAdmin * pCertAdmin = NULL;
BSTR bstrCA = NULL; // variable for machine\CAName
long nReqID; // variable for Request ID
HRESULT hr;
// Initialize COM.
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (FAILED(hr))
{
printf("Failed CoInitializeEx [%x]\n", hr);
goto error;
}
// Create the CertAdmin object
// and get a pointer to its ICertAdmin interface.
hr = CoCreateInstance( CLSID_CCertAdmin,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICertAdmin,
(void **)&pCertAdmin);
if (FAILED(hr))
{
printf("Failed CoCreateInstance pCertAdmin [%x]\n", hr);
goto error;
}
// Note the use of two '\' in C++ to produce one '\'.
bstrCA = SysAllocString(L"<COMPUTERNAMEHERE>\\<CANAMEHERE>");
if (NULL == bstrCA)
{
printf("Failed to allocate memory for bstrCA\n");
goto error;
}
// nReqID is RequestID to be denied.
nReqID = <REQUESTIDHERE>;
// Deny the request.
hr = pCertAdmin->DenyRequest( bstrCA, nReqID );
if (FAILED(hr))
{
printf("Failed DenyRequest %ws %d [%x]\n",
bstrCA, nReqID, hr);
goto error;
}
else
printf("Denied request %ws %d\n",
bstrCA, nReqID );
// Done processing.
error:
// Free BSTR values.
if (NULL != bstrCA)
SysFreeString(bstrCA);
// Clean up object resources.
if (NULL != pCertAdmin)
pCertAdmin->Release();
// Free COM resources.
CoUninitialize();
指定した証明書要求を、指定した証明機関のポリシーモジュールに送信します。このメソッドは ICertAdmin インターフェイスで最初に導入されました。
| strConfig | LPWSTR | in | 証明機関(CA)の有効な構成文字列を COMPUTERNAME\CANAME の形式で表します。COMPUTERNAME は Certificate Services サーバーのネットワーク名、CANAME は Certificate Services のセットアップ時に入力した証明機関の共通名です。構成文字列名については、 ICertConfig を参照してください。 重要 ResubmitRequest は、構成文字列が変更されても内部キャッシュをクリアしません。CA の構成文字列を変更する場合は、新しい ICertAdmin オブジェクトをインスタンス化し、新しい構成文字列でこのメソッドを再度呼び出す必要があります。
|
| RequestId | INT | in | 再送信する要求の ID を指定します。 |
| pDisposition | INT* | out | 要求の処理状況へのポインターです。 |
戻り値
C++
メソッドが成功し、pDisposition パラメーターが要求の処理状況を指定する次のいずれかの値に設定された場合、メソッドは S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は要求の処理状況を指定します。この値は次のいずれかの値です。| リターンコード | 説明 |
|---|---|
| 要求が完了しませんでした。 | |
| 要求が失敗しました。 | |
| 要求が拒否されました。 | |
| 証明書が発行されました。 | |
| 証明書が個別に発行されました。 | |
| 要求が送信中として受け付けられました。 |
解説(Remarks)
管理タスクは DCOM を使用します。以前のバージョンの Certadm.h で定義されているこのインターフェイスのメソッドを呼び出すコードは、クライアントとサーバーが両方とも同じ Windows オペレーティングシステムを実行している限り、Windows ベースのサーバーで動作します。
例
#include <windows.h>
#include <stdio.h>
#include <Certadm.h>
long nDisp; // disposition value
long nReqID = <REQUESTIDHERE>;
BSTR bstrCA = NULL;
bstrCA = SysAllocString(L"<COMPUTERNAMEHERE>\\<CANAMEHERE>");
if (NULL == bstrCA)
{
printf("Memory allocation failed\n");
goto error;
}
// pCertAdmin is a previously instantiated ICertAdmin object.
hr = pCertAdmin->ResubmitRequest(bstrCA, nReqID, &nDisp);
if (FAILED(hr))
{
printf("Failed ResubmitRequest [%x]\n", hr);
goto error;
}
else
printf("ResubmitRequest disposition is %d\n", nDisp);
error:
// Free resources.
if (bstrCA)
SysFreeString(bstrCA);
Certificate Services の証明機関(CA)に対して、新しい証明書失効リスト(CRL)を発行する要求を送信します。このメソッドは ICertAdmin インターフェイスで最初に導入されました。
| strConfig | LPWSTR | in | CA の有効な構成文字列を COMPUTERNAME\CANAME の形式で表します。COMPUTERNAME は Certificate Services サーバーのネットワーク名、CANAME は Certificate Services のセットアップ時に入力した証明機関の共通名です。構成文字列名については、ICertConfig を参照してください。 重要 PublishCRL は、構成文字列が変更されても内部キャッシュをクリアしません。CA の構成文字列を変更する場合は、新しい ICertAdmin オブジェクトをインスタンス化し、新しい構成文字列でこのメソッドを再度呼び出す必要があります。
|
| Date | DOUBLE | in | CRL の次回更新日時を協定世界時(グリニッジ標準時)で指定します。 Date が 0 以外の場合、CRL の次回更新日時は Date になりますが、Certificate Services によって適用される丸めや上限の制約を受けます。Date が 0 の場合、CRL の次回更新日時は既定の CRL 発行期間から計算されます。 |
戻り値
VB
メソッドが成功すると、メソッドは S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
管理タスクは DCOM を使用します。以前のバージョンの Certadm.h で定義されているこのインターフェイスのメソッドを呼び出すコードは、クライアントとサーバーが両方とも同じ Windows オペレーティングシステムを実行している限り、Windows ベースのサーバーで動作します。
例
次の例は、CRL の発行を示しています。
DATE ExpDate; // CRL expiration date
SYSTEMTIME st;
BSTR bstrCA = NULL;
// Set the CRL Expiration Date to Noon on Jan. 1, 2005 GMT.
// Zero out values first
// (avoids setting minutes, seconds, and so on).
memset(&st, 0, sizeof(SYSTEMTIME));
st.wYear = 2005;
st.wMonth = 1; // Jan
st.wDay = 1; // 1st day of month
st.wHour = 12; // Noon
// Place the date in required format.
if (!SystemTimeToVariantTime(&st, &ExpDate))
{
printf("Unable to convert time\n");
goto error;
}
bstrCA = SysAllocString(L"<COMPUTERNAMEHERE>\\<CANAMEHERE>");
if (NULL == bstrCA)
{
printf("Memory allocation failed\n");
goto error;
}
// Publish the CRL.
// pCertAdmin is a previously instantiated ICertAdmin object.
hr = pCertAdmin->PublishCRL(bstrCA, ExpDate);
if (FAILED(hr))
{
printf("Failed PublishCRL [%x]\n", hr);
goto error;
}
else
printf("PublishCRL succeeded\n");
Certificate Services の証明機関(CA)の現在の証明書失効リスト(CRL)を取得します。
| strConfig | LPWSTR | in | CRL を取得する対象の CA の有効な構成文字列を表します。この文字列は COMPUTERNAME\CANAME の形式で、COMPUTERNAME は Certificate Services サーバーのネットワーク名、CANAME は Certificate Services のセットアップ時に入力した CA の共通名です。構成文字列名については、ICertConfig を参照してください。 重要 GetCRL は、構成文字列が変更されても内部キャッシュをクリアしません。CA の構成文字列を変更する場合は、新しい ICertAdmin オブジェクトをインスタンス化し、新しい構成文字列でこのメソッドを再度呼び出す必要があります。
| ||||||||
| Flags | INT | in | 返される CRL の形式を指定します。このパラメーターには、次のいずれかのフラグを指定できます。
| ||||||||
| pstrCRL | LPWSTR* | out | CRL を受け取る BSTR へのポインターです。 このメソッドを使用するときは、BSTR 型の変数を作成し、その変数を NULL に設定して、その変数のアドレスを pbstrCRL パラメーターに渡します。BSTR 変数の使用が終わったら、SysFreeString 関数を呼び出して解放します。 |
戻り値
関数が成功すると、関数は S_OK を返します。
関数が失敗した場合は、エラーを示す HRESULT 値を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
| リターンコード | 説明 |
|---|---|
| strConfig パラメーターを NULL にすることはできません。または、CRL が見つかりませんでした。 |
解説(Remarks)
管理タスクは DCOM を使用します。以前のバージョンの Certadm.h で定義されているこのインターフェイスのメソッドを呼び出すコードは、クライアントとサーバーが両方とも同じ Windows オペレーティングシステムを実行している限り、Windows ベースのサーバーで動作します。
例
次の例では、必要な変数を宣言し、COM を初期化して、CertAdmin クラスのインスタンスを作成します。次に GetCRL を呼び出し、成功または失敗を画面に出力します。最後にリソースを解放します。
ICertAdmin * pCertAdmin = NULL; // pointer to interface object
BSTR bstrCA = NULL; // variable for machine\CAName
BSTR bstrCRL = NULL; // variable to contain
// the retrieved CRL
HRESULT hr;
// Initialize COM.
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (FAILED(hr))
{
printf("Failed CoInitializeEx [%x]\n", hr);
goto error;
}
// Create the CertAdmin object
// and get a pointer to its ICertAdmin interface.
hr = CoCreateInstance( CLSID_CCertAdmin,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICertAdmin,
(void **)&pCertAdmin);
if (FAILED(hr))
{
printf("Failed CoCreateInstance pCertAdmin [%x]\n", hr);
goto error;
}
// Note the use of two backslashes (\\)
// in C++ to produce one backslash (\).
bstrCA = SysAllocString(L"<COMPUTERNAMEHERE>\\<CANAMEHERE>");
if (FAILED(hr))
{
printf("Failed to allocate memory for bstrCA\n");
goto error;
}
// Retrieve the CRL.
hr = pCertAdmin->GetCRL( bstrCA, CR_OUT_BINARY, &bstrCRL );
if (FAILED(hr))
{
printf("Failed GetCRL [%x]\n", hr);
goto error;
}
else
printf("CRL retrieved successfully\n");
// Use the CRL as needed.
// Done processing.
error:
// Free BSTR values.
if (NULL != bstrCA)
SysFreeString(bstrCA);
if (NULL != bstrCRL)
SysFreeString(bstrCRL);
// Clean up object resources.
if (NULL != pCertAdmin)
pCertAdmin->Release();
// Free COM resources.
CoUninitialize();
以前に発行された証明書を取得し、証明機関(CA)のデータベースにインポートします。このメソッドは ICertAdmin インターフェイスで最初に定義されました。
| strConfig | LPWSTR | in | 証明機関の有効な構成文字列を COMPUTERNAME\CANAME の形式で表します。COMPUTERNAME は Certificate Services サーバーのネットワーク名、CANAME は Certificate Services のセットアップ時に入力した証明機関の共通名です。構成文字列名については、 ICertConfig を参照してください。 重要 ImportCertificate は、構成文字列が変更されても内部キャッシュをクリアしません。CA の構成文字列を変更する場合は、新しい ICertAdmin オブジェクトをインスタンス化し、新しい構成文字列でこのメソッドを再度呼び出す必要があります。
| ||||||||
| strCertificate | LPWSTR | in | インポートする証明書のバイナリ表現です。 | ||||||||
| Flags | CERT_IMPORT_FLAGS | in | 証明書の形式を指定します。このパラメーターには、次のいずれかの値を指定できます。
| ||||||||
| pRequestId | INT* | out | インポートされた証明書に対してデータベースが割り当てた要求 ID を受け取る LONG 値へのポインターです。 |
戻り値
C++
メソッドが成功し、pRequestID パラメーターにインポートされた証明書のデータベースが割り当てた要求 ID の値が設定された場合、メソッドは S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、インポートされた証明書に対してデータベースが割り当てた要求 ID です。解説(Remarks)
ImportCertificate メソッドは、バックアップから部分的に復元された証明機関の場合に役立ちます。証明機関の復元に使用したバックアップテープに証明書が含まれていないが、ファイルとして存在する場合、このメソッドを使用してその証明書をインポートできます。
このメソッドを成功させるには、インポートする証明書が、strConfig で指定した証明機関によって以前に発行されたものである必要があります。復元された証明機関は証明書の署名を検証し、署名が無効な場合、メソッドの呼び出しは失敗します。
さらに、証明書がデータベースに既に存在する場合はインポートできません。データベース内の各証明書は一意である必要があります。データベースは、証明書のシリアル番号を確認することで一意性を保証します。
例
// This code imports a binary certificate file.
BSTR bstrCert = NULL; // Variable for certificate.
HANDLE hFile;
DWORD cchFile, cbRead;
LONG nID; // Variable for request ID.
// Open the file that contains the certificate.
hFile = CreateFile((LPCSTR) "d:\\cert1.cer",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
printf("Unable to open file\n");
// Take error action as needed.
}
// Determine the file size.
cchFile = GetFileSize(hFile, NULL);
if ( (DWORD)-1 == cchFile )
{
printf("Failed GetFileSize\n");
CloseHandle(hFile);
// Take error action as needed.
}
// Allocate the memory for the certificate.
bstrCert = SysAllocStringByteLen(NULL, cchFile);
if (NULL == bstrCert)
{
printf("Failed SysAllocStringByteLen\n");
CloseHandle(hFile);
// Take error action as needed.
}
// Read in the certificate.
if (!ReadFile(hFile,
(char *)bstrCert,
cchFile,
&cbRead,
NULL) || (cbRead != cchFile))
{
printf("Failed to successfully read file\n");
CloseHandle(hFile);
SysFreeString(bstrCert);
// Take error action as needed.
}
// Close the file.
CloseHandle(hFile);
// Import the certificate.
bstrCA = SysAllocString(L"<COMPUTERNAMEHERE>\\<CANAMEHERE>");
if (FAILED(hr))
{
printf("Failed to allocate memory for bstrCA\n");
SysFreeString(bstrCert);
// Take error action as needed.
}
hr = pCertAdmin->ImportCertificate(bstrCA,
bstrCert,
CR_IN_BINARY,
&nID);
if (FAILED(hr))
printf("Failed ImportCertificate [%x]\n", hr);
else
printf("Imported certificated has Request ID: %d\n", nID);
SysFreeString(bstrCert);
SysFreeString(bstrCA);
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ICertAdmin "{34DF6950-7FB6-11D0-8817-00A0C903B83C}" #usecom global ICertAdmin IID_ICertAdmin "{}" #comfunc global ICertAdmin_IsValidCertificate 7 wstr,wstr,var #comfunc global ICertAdmin_GetRevocationReason 8 var #comfunc global ICertAdmin_RevokeCertificate 9 wstr,wstr,int,double #comfunc global ICertAdmin_SetRequestAttributes 10 wstr,int,wstr #comfunc global ICertAdmin_SetCertificateExtension 11 wstr,int,wstr,int,int,var #comfunc global ICertAdmin_DenyRequest 12 wstr,int #comfunc global ICertAdmin_ResubmitRequest 13 wstr,int,var #comfunc global ICertAdmin_PublishCRL 14 wstr,double #comfunc global ICertAdmin_GetCRL 15 wstr,int,var #comfunc global ICertAdmin_ImportCertificate 16 wstr,wstr,int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_ICertAdmin "{34DF6950-7FB6-11D0-8817-00A0C903B83C}" #usecom global ICertAdmin IID_ICertAdmin "{}" #comfunc global ICertAdmin_IsValidCertificate 7 wstr,wstr,sptr #comfunc global ICertAdmin_GetRevocationReason 8 sptr #comfunc global ICertAdmin_RevokeCertificate 9 wstr,wstr,int,double #comfunc global ICertAdmin_SetRequestAttributes 10 wstr,int,wstr #comfunc global ICertAdmin_SetCertificateExtension 11 wstr,int,wstr,int,int,sptr #comfunc global ICertAdmin_DenyRequest 12 wstr,int #comfunc global ICertAdmin_ResubmitRequest 13 wstr,int,sptr #comfunc global ICertAdmin_PublishCRL 14 wstr,double #comfunc global ICertAdmin_GetCRL 15 wstr,int,sptr #comfunc global ICertAdmin_ImportCertificate 16 wstr,wstr,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。