Получить список имен хранилища сертификатов в C # - PullRequest
6 голосов
/ 27 октября 2010

Я могу получить коллекцию сертификатов в отдельном хранилище, используя следующую оценку:

X509Store.Certificates

Но не уверен, как получить список имен хранилищ сертификатов, представленных в текущемпользователь или локальный компьютер.Я также проверил перечисление StoreName, но в нем перечислены только стандартные имена магазинов, но не те, которые определены пользователем.

Я хочу список СЕРТИФИКАТОВ, а не список сертификатов в конкретном магазине.

Ответы [ 3 ]

10 голосов
/ 29 октября 2010

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

Не думайте, что есть управляемый .net способ сделать это.Возможно, самым близким может быть использование функций реестра .net для чтения имен хранилищ из реестра?

3 голосов
/ 19 января 2012

Вы можете вызвать скрипт Powershell из кода C #.Вот пример функции (необходимо добавить в проект ссылку на сборку 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 голос
/ 29 июня 2017

Как уже упоминалось, дотальхимия, вы должны прочитать имена из реестра.Проверьте следующий сайт для местоположений: 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...