📄 inituser.c
字号:
//listcert.c
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
void HandleError(char *s);
void main(void){
HCERTSTORE hCertStore;
PCCERT_CONTEXT pCertContext=NULL;
char pszNameString[256];
char pszStoreName[256];
void* pvData;
DWORD cbData;
DWORD dwPropId = 0;
//--------------------------------------------------------------------
// 首先获取系统证书库名字,以便列举其中的证书及其属性
fprintf(stderr,"请输入库名:");
scanf("%s",pszStoreName);
fprintf(stderr,"库名为%s\n",pszStoreName);
//--------------------------------------------------------------------
//打开系统证书库
if ( hCertStore = CertOpenSystemStore(
NULL,
pszStoreName))
{
fprintf(stderr,"系统证书库%s已被打开\n", pszStoreName);
}
else
{
HandleError("库打开失败");
}
//--------------------------------------------------------------------
//调用CertEnumCertificatesInStore函数从打开库中获取证书
while(pCertContext= CertEnumCertificatesInStore(
hCertStore,
pCertContext))
{
//--------------------------------------------------------------------
//如果一个证书被恢复,则继续
if(CertGetNameString(
pCertContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
pszNameString,
128))
{
printf("\n%s的证书 \n",pszNameString);
}
else
fprintf(stderr,"调用CertGetName出错\n");
//--------------------------------------------------------------------
//循环查找指定证书的所有属性标识,直到CertEnumCertificateContextProperties返回0
while(dwPropId = CertEnumCertificateContextProperties(
pCertContext, // 列举其属性的上下文
dwPropId))
{
//--------------------------------------------------------------------
//打印属性数
printf("属性 # %d 找到->", dwPropId);
//--------------------------------------------------------------------
// 显示找到的属性种类
switch(dwPropId)
{
case CERT_FRIENDLY_NAME_PROP_ID:
{
printf("Friendly name: ");
break;
}
case CERT_SIGNATURE_HASH_PROP_ID:
{
printf("Signature hash identifier ");
break;
}
case CERT_KEY_PROV_HANDLE_PROP_ID:
{
printf("KEY PROVE HANDLE");
break;
}
case CERT_KEY_PROV_INFO_PROP_ID:
{
printf("KEY PROV INFO PROP ID ");
break;
}
case CERT_SHA1_HASH_PROP_ID:
{
printf("SHA1 HASH identifier");
break;
}
case CERT_MD5_HASH_PROP_ID:
{
printf("md5 hash identifier ");
break;
}
case CERT_KEY_CONTEXT_PROP_ID:
{
printf("KEY CONTEXT PROP identifier");
break;
}
case CERT_KEY_SPEC_PROP_ID:
{
printf("KEY SPEC PROP identifier");
break;
}
case CERT_ENHKEY_USAGE_PROP_ID:
{
printf("ENHKEY USAGE PROP identifier");
break;
}
case CERT_NEXT_UPDATE_LOCATION_PROP_ID:
{
printf("NEXT UPDATE LOCATION PROP identifier");
break;
}
case CERT_PVK_FILE_PROP_ID:
{
printf("PVK FILE PROP identifier ");
break;
}
case CERT_DESCRIPTION_PROP_ID:
{
printf("DESCRIPTION PROP identifier ");
break;
}
case CERT_ACCESS_STATE_PROP_ID:
{
printf("ACCESS STATE PROP identifier ");
break;
}
case CERT_SMART_CARD_DATA_PROP_ID:
{
printf("SMAART_CARD DATA PROP identifier ");
break;
}
case CERT_EFS_PROP_ID:
{
printf("EFS PROP identifier ");
break;
}
case CERT_FORTEZZA_DATA_PROP_ID:
{
printf("FORTEZZA DATA PROP identifier ");
break;
}
case CERT_ARCHIVED_PROP_ID:
{
printf("ARCHIVED PROP identifier ");
break;
}
case CERT_KEY_IDENTIFIER_PROP_ID:
{
printf("KEY IDENTIFIER PROP identifier ");
break;
}
case CERT_AUTO_ENROLL_PROP_ID:
{
printf("AUTO ENROLL identifier. ");
break;
}
} // End switch
//--------------------------------------------------------------------
// 获取证书属性信息
if(CertGetCertificateContextProperty(
pCertContext,
dwPropId ,
NULL,
&cbData))
{
//继续
}
else
{
//如果第一调用失败则退出
HandleError("调用etCertContextProperty #1 失败");
}
//--------------------------------------------------------------------
//如果调用成功,为属性分配内存
if(pvData = (void*)malloc(cbData))
{
//内存已分配,继续
}
else
{
HandleError("Memory allocation failed.");
}
//-----------------------------------------------------------------
// 分配成功,接收属性信息
if(CertGetCertificateContextProperty(
pCertContext,
dwPropId,
pvData,
&cbData))
{
}
else
{
HandleError("Call #2 failed.");
}
//显示结果
printf("属性内容为%d \n", pvData);
//-----------------------------------------------------------------
free(pvData);
} // End inner while
} // End outer while
CertFreeCertificateContext(pCertContext);
CertCloseStore(hCertStore,0);
printf("The function completed successfully. \n");
} // End of main
//错误处理函数
void HandleError(char *s)
{
printf("在运行程序时出现错误\n");
printf("%s\n",s);
printf("错误代号 %x\n.",GetLastError());
printf("程序终止运行\n");
exit(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -