8

次のステートメントを使用して、特定のストアで証明書コレクションを取得できます。

X509Store.Certificates

しかし、現在のユーザーまたはローカルマシンに存在する証明書ストア名のリストを取得する方法がわかりません。StoreNameの列挙も確認しましたが、標準のストア名のみがリストされ、ユーザーが定義したものはリストされていません。

特定のストアの証明書のリストではなく、証明書ストアのリストが必要です。

4

3 に答える 3

10

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

これを行うためのマネージド.netの方法があるとは思わないでください。おそらく最も近いのは、.netのレジストリ関数を使用してレジストリからストア名を読み取ることです。

于 2010-10-28T20:50:15.360 に答える
2

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();
    }
于 2012-01-19T11:29:18.130 に答える
2

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();
    }
}
于 2017-06-29T18:02:09.807 に答える