2010-10-27 51 views
5

我能夠通過使用以下語句在特定商店中獲取證書集合。獲取C#中的證書存儲名稱列表

X509Store.Certificates

但不知道怎樣才能得到當前用戶或本地計算機根據目前的證書存儲區名稱的列表。我也檢查了StoreName枚舉,但它只列出了標準的商店名稱,但沒有列出用戶定義的名稱。

我想獲得CERTIFICATE STORES的列表,而不是特定商店中的證書列表。

回答

3

您可以從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 2012-04-10 23:02:29

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(); 
    } 
}