Question

I am able to get certificate collection in particulaer store by using the following statment.

X509Store.Certificates

But not sure how I can get the list of certificate store names present under current user or local machine. I also checked the StoreName enumeration but it only lists the standard store names but not the ones defined by the user.

I want the list of CERTIFICATE STORES, not the list of certificates in the particular store.

Was it helpful?

Solution

http://msdn.microsoft.com/en-us/library/aa376058(VS.85).aspx

Don't think there's a managed .net way of doing this. Possibly the closest may be to use .net's registry functions to read the store names from the registry?

OTHER TIPS

You can invoke Powershell script from C# code. Here is an sample function (You need to add in project a reference to System.Management.Automation assembly) which returns a list of certificate stores for 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();
    }

As dotalchemy mentioned, you have to read the names from the registry. Check out the following site for locations: https://msdn.microsoft.com/en-us/library/windows/desktop/aa388136(v=vs.85).aspx

For example the CERT_SYSTEM_STORE_LOCAL_MACHINE is located at

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates

Here's how to get the names/stores

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();
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top