我创建了一个下面列出的C#.Net控制台程序来扫描所有证书存储并显示证书信息。问题是它没有显示所有证书。
例如,此命令行显示个人存储中的证书:
CERTUTIL.EXE -store My
但是我的测试程序显示它没有个人证书。我正在使用Windows 2008 R2。这是缩写的控制台应用程序。知道我可能做错了什么吗?我在常规CMD窗口和管理员中都尝试了相同的结果。
using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Collections;
namespace CertView
{
class Program
{
static int Main(string[] args)
{
var stores = Enum.GetValues(typeof(StoreName));
IEnumerator enumStores = stores.GetEnumerator();
foreach (StoreName sn in stores)
{
X509Store str = new X509Store(sn.ToString());
str.Open(OpenFlags.ReadOnly);
int count = str.Certificates.Count;
if (count > 0)
{
Console.WriteLine("Store: " + sn.ToString() + Environment.NewLine);
foreach (X509Certificate2 x509 in str.Certificates)
{
Console.WriteLine("Friendly name: {0}", x509.FriendlyName);
Console.WriteLine("Issued to: " + x509.GetNameInfo(X509NameType.SimpleName, false));
Console.WriteLine("Issued by: " + x509.GetNameInfo(X509NameType.SimpleName, true));
Console.WriteLine("Thumbprint: " + x509.Thumbprint);
x509.Reset();
}
}
str.Close();
}
}
}
}
答案 0 :(得分:2)
这是因为certutil
默认关注LocalMachine
商店,而X509Store
关注CurrentUser
商店。阅读X509Store
构造函数:https://msdn.microsoft.com/en-us/library/h16bc8wd(v=vs.110).aspx
您需要在指定商店位置的位置使用不同的构造函数。例如,这一个:X509Store(StoreName,StoreLocation)