在C#中获取证书存储名称列表

8

我可以使用以下语句获取特定存储中的证书集合:

X509Store.Certificates

但是,我不确定如何获取当前用户或本地计算机下存在的证书存储名称列表。我也检查了StoreName枚举,但它仅列出标准存储名称,而不是用户定义的存储名称。

我想要的是证书存储的列表,而不是特定存储中的证书列表。

3个回答

10

2
如dotalchemy所提到的,您需要从注册表中读取名称。请查看以下网站以获取位置信息: https://msdn.microsoft.com/en-us/library/windows/desktop/aa388136(v=vs.85).aspx 例如,CERT_SYSTEM_STORE_LOCAL_MACHINE位于以下位置: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates
以下是获取名称/存储的方法。
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();
    }
}

2

您可以从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();
    }

1
还有一个很好的获取商店名称的例子,但需要使用PowerShell来执行。 - Imran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接