EternalWindows
証明書管理 / 証明書管理ダイアログ

証明書を取り扱うアプリケーションは、 証明書ストアに格納されている証明書をGUIで表示したい場合がよくあります。 そのようなGUIの1つには、IEのインターネットオプションから表示できる 次のようなダイアログが挙げられるでしょう。

このような証明書に関係するダイアログを表示する関数は、 cryptui.dllからエクスポートされることになっています。 今回は、上記したダイアログを表示するCryptUIDlgCertMgrについて説明します。

BOOL CryptUIDlgCertMgr(
  PCCRYPTUI_CERT_MGR_STRUCT pCryptUICertMgr
);

pCryptUICertMgrは、証明書管理ダイアログを作成する情報を 含むCRYPTUI_CERT_MGR_STRUCT構造体のアドレスを指定します。 この構造体は、次のように定義されています。

typedef struct _CRYPTUI_CERT_MGR_STRUCT {
  DWORD dwSize;
  HWND hwndParent;
  DWORD dwFlags;
  LPCWSTR pwszTitle;
  LPCSTR pszInitUsageOID;
} CRYPTUI_CERT_MGR_STRUCT,  *PCRYPTUI_CERT_MGR_STRUCT;

dwSizeは、構造体のサイズをバイト単位で指定します。 hwndParentは、ダイアログの親ウインドウのハンドルを指定します。 dwFlagsは、予約されているため0を指定しますが、 ヘッダーファイルに定義されているCRYPTUI_CERT_MGR_SINGLE_TAB_FLAGを指定すると、 「個人」のタブのみを表示することができるようです。 pwszTitleは、ダイアログのタイトルを指定します。 pszInitUsageOIDは、拡張鍵用途を表すOIDを指定します。 拡張鍵用途は、クライアント認証や電子メールの保護などの、 証明書管理ダイアログにおける「目的」を表すことができ、 指定したOIDに対応する目的が選択状態となります。

今回のプログラムは、証明書管理ダイアログを表示する例を示しています。 CryptUIの関数を呼び出す場合は、cryptuiapi.hのインクルードとcryptui.libへの リンクが必要です。

#include <windows.h>
#include <cryptuiapi.h>

#pragma comment (lib, "crypt32.lib")
#pragma comment (lib, "cryptui.lib")

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	CRYPTUI_CERT_MGR_STRUCT certMgr;

	certMgr.dwSize          = sizeof(CRYPTUI_CERT_MGR_STRUCT);
	certMgr.hwndParent      = NULL;
	certMgr.dwFlags         = 0;
	certMgr.pwszTitle       = NULL;
	certMgr.pszInitUsageOID = NULL;

	CryptUIDlgCertMgr(&certMgr);

	return 0;
}

CRYPTUI_CERT_MGR_STRUCT構造体の初期化は、見ての通り単純です。 親ウインドウを作成していない場合はhwndParentにNULLを指定し、 ダイアログのタイトルを指定するつもりがない場合は、 pwszTitleもNULLで構いません。 pszInitUsageOIDに拡張鍵用途のszOID_PKIX_KP_EMAIL_PROTECTIONを指定した場合は、 電子メールの保護が「目的」として選択されることになりますが、 このメンバについてもNULLを指定して問題ありません。

OpenPersonalTrustDBDialogExの利用

証明書管理ダイアログの表示は、CryptUIDlgCertMgrで行うのが最も適切であると思われますが、 wintrust.dllからエクスポートされるOpenPersonalTrustDBDialogExでも表示することができます。 以下に、その呼び出しの例を示します。

#include <windows.h>

typedef BOOL (WINAPI *LPFNOPENPERSONALTRUSTDBDIALOGEX)(HWND, DWORD, PVOID *);

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	HMODULE                         hmod;
	LPFNOPENPERSONALTRUSTDBDIALOGEX lpfnOpenPersonalTrustDBDialogEx;

	hmod = LoadLibrary(L"wintrust.dll");
	if (hmod == NULL)
		return 0;

	lpfnOpenPersonalTrustDBDialogEx = (LPFNOPENPERSONALTRUSTDBDIALOGEX)GetProcAddress(hmod, "OpenPersonalTrustDBDialogEx");
	if (lpfnOpenPersonalTrustDBDialogEx == NULL) {
		FreeLibrary(hmod);
		return 0;
	}
	
	lpfnOpenPersonalTrustDBDialogEx(NULL, 0, NULL);

	FreeLibrary(hmod);

	return 0;
}

OpenPersonalTrustDBDialogExの第1引数は親ウインドウのハンドルですが、NULLを指定することができます。 第2引数は0または、2を指定することができます。 0の場合は、「信頼された発行元」がスタートページとなってダイアログが表示され、 2の場合は、「信頼された発行元」のページだけが表示されます。 この2を指定した場合の動作は、CryptUIDlgCertMgrで実現することはできません。 第3引数は、使用されないためNULLを指定します。



戻る