[DllImport("crypt32.dll", EntryPoint = "CertGetNameString", CharSet = CharSet.Auto, SetLastError = true)]
static extern UInt32 CertGetNameString(IntPtr CertContext, UInt32 lType, UInt32 lFlags, IntPtr pTypeParameter, System.Text.StringBuilder str, UInt32 cch);
Declare Function CertGetNameString Lib "Crypt32.dll" Alias "CertGetNameStringW" ( _
ByVal pCertContext As Long, _
ByVal dwType As Long, _
ByVal dwFlags As Long, _
pvTypePara As Any, _
ByVal pszNameString As Long, _
ByVal cchNameString As Long _
) As Long
const uint CERT_NAME_EMAIL_TYPE = 1;
const uint CERT_NAME_RDN_TYPE = 2;
const uint CERT_NAME_ATTR_TYPE = 3;
const uint CERT_NAME_SIMPLE_DISPLAY_TYPE = 4;
const uint CERT_NAME_FRIENDLY_DISPLAY_TYPE = 5;
const uint CERT_NAME_DNS_TYPE = 6;
const uint CERT_NAME_URL_TYPE = 7;
const uint CERT_NAME_UPN_TYPE = 8;
const uint CERT_NAME_ISSUER_FLAG = 0x1;
const uint CERT_NAME_DISABLE_IE4_UTF8_FLAG = 0x00010000;
Do you know one? Please contribute it!
For VB usage:
Ensure you use StrPtr and that the function signature is "CertGetNameStringW", or you will regularly crash your program!
You can call this first with a null buffer and null cchNameString to return just the required buffer length, then size the buffer appropriately and call again as above!
C#:
while ((certContext = CertEnumCertificatesInStore(hCertStore, certContext)) != IntPtr.Zero)
{
StringBuilder Buffer = new StringBuilder(255);
UInt32 cchString = 255 ;
System.UInt32 nChars = CertGetNameString(certContext,
CERT_NAME_FRIENDLY_DISPLAY_TYPE,
CERT_NAME_ISSUER_FLAG,
IntPtr.Zero,
Buffer,
cchString);
// use Buffer.ToString() to use the cert's name string
}
VB:
Dim bfr As String, bPtr As Long
bfr = String(szNameString, vbNullChar)
bPtr = StrPtr(bfr)
szNameString = CertGetNameString(hCert_Context&, _
CERT_NAME_SIMPLE_DISPLAY_TYPE, _
0&, _
0&, _
bPtr&, _
128& _
)