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

C# 获取C中的证书存储名称列表#,c#,certificate-store,C#,Certificate Store,我可以使用以下语句在特定的存储中获取证书收集 X509Store.Certificates 但不确定如何获取当前用户或本地计算机下存在的证书存储名称列表。我还检查了StoreName枚举,但它只列出了标准的商店名称,而没有列出用户定义的名称 我想要证书存储列表,而不是特定存储中的证书列表。 不要认为有一种托管的.net方法可以做到这一点。可能最接近的方法是使用.net的注册表函数从注册表读取存储名称?您可以从C代码调用Powershell脚本。下面是一个示例函数(您需要在project中添加对S

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

X509Store.Certificates

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

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


不要认为有一种托管的.net方法可以做到这一点。可能最接近的方法是使用.net的注册表函数从注册表读取存储名称?

您可以从C代码调用Powershell脚本。下面是一个示例函数(您需要在project中添加对System.Management.Automation assembly的引用),它返回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();
    }
private静态字符串[]GetLocalMachineStoresNames()
{
列出姓名;
使用(RunspaceInvoke runtimeInvoke=new RunspaceInvoke())
{
收集结果=runtimeInvoke.Invoke(@“cd cert:\LocalMachine;dir |%{$\u.Name}”);
名称=新列表();
for(Int32 q=0;q
正如dotalchemy提到的,您必须从注册表中读取名称。查看以下站点以了解位置:

例如,CERT_SYSTEM_STORE_LOCAL_机器位于

HKEY\U LOCAL\U 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();
    }
}

还有一个很好的示例可以获取存储名称,但需要PowerShell来执行此操作。