我可以使用以下语句获取特定存储中的证书集合:
X509Store.Certificates
但是,我不确定如何获取当前用户或本地计算机下存在的证书存储名称列表。我也检查了StoreName枚举,但它仅列出标准存储名称,而不是用户定义的存储名称。
我想要的是证书存储的列表,而不是特定存储中的证书列表。
我可以使用以下语句获取特定存储中的证书集合:
X509Store.Certificates
但是,我不确定如何获取当前用户或本地计算机下存在的证书存储名称列表。我也检查了StoreName枚举,但它仅列出标准存储名称,而不是用户定义的存储名称。
我想要的是证书存储的列表,而不是特定存储中的证书列表。
http://msdn.microsoft.com/en-us/library/aa376058(VS.85).aspx
不认为有使用托管的 .net 方法来实现这个。可能最接近的方法是使用 .net 的注册表函数从注册表中读取商店名称?
using (var rootKeySystemCertificates = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\SystemCertificates", false))
{
foreach (var subKeyName in rootKeySystemCertificates.GetSubKeyNames())
{
var store = new X509Store(subKeyName, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
//your part with store.Certificates...
store.Close();
}
}
您可以从C#代码中调用Powershell脚本。以下是一个示例函数(您需要在项目中添加对System.Management.Automation程序集的引用),该函数返回LocalMachine的证书存储列表:
private static String[] GetLocalMachineStoresNames()
{
List<String> names;
using (RunspaceInvoke runtimeInvoke = new RunspaceInvoke())
{
Collection<PSObject> results = runtimeInvoke.Invoke(@" cd cert:\LocalMachine; dir | % { $_.Name }");
names = new List<String>();
for (Int32 q = 0; q < results.Count; q++)
{
names.Add(results[q].BaseObject.ToString());
}
}
return names.ToArray();
}