⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inituser.c

📁 C++编程实践与技巧一书各章节的源码
💻 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 + -