次のステートメントを使用して、特定のストアで証明書コレクションを取得できます。
X509Store.Certificates
しかし、現在のユーザーまたはローカルマシンに存在する証明書ストア名のリストを取得する方法がわかりません。StoreNameの列挙も確認しましたが、標準のストア名のみがリストされ、ユーザーが定義したものはリストされていません。
特定のストアの証明書のリストではなく、証明書ストアのリストが必要です。
次のステートメントを使用して、特定のストアで証明書コレクションを取得できます。
X509Store.Certificates
しかし、現在のユーザーまたはローカルマシンに存在する証明書ストア名のリストを取得する方法がわかりません。StoreNameの列挙も確認しましたが、標準のストア名のみがリストされ、ユーザーが定義したものはリストされていません。
特定のストアの証明書のリストではなく、証明書ストアのリストが必要です。
http://msdn.microsoft.com/en-us/library/aa376058(VS.85).aspx
これを行うためのマネージド.netの方法があるとは思わないでください。おそらく最も近いのは、.netのレジストリ関数を使用してレジストリからストア名を読み取ることです。
C#コードからPowershellスクリプトを呼び出すことができます。LocalMachineの証明書ストアのリストを返すサンプル関数(プロジェクトにSystem.Management.Automationアセンブリへの参照を追加する必要があります)を次に示します。
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();
}
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();
}
}