2010-10-27 2 views
5

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

X509Store.Certificates

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

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

ответ

9

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

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

+0

Благодаря это действительно решить мою проблему , – Imran

+0

Прохладный! Нажмите маленькую стрелку вверх над номером влево :) – dotalchemy

3

Вы можете вызвать скрипт 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

Еще один хороший пример, чтобы получить имена магазинов, но PowerShell требуется для выполнения этого. – Imran

0

Как уже упоминалось 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(); 
    } 
} 
Смежные вопросы