public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public string Name { get; set; }
public string HasPrivateKey { get; set; }
public string Location { get; set; }
public string Issuer { get; set; }
private void button1_Click(object sender, EventArgs e)
{
var stores = new Dictionary<StoreName, string>()
{
{ StoreName.My,"Personal"},
{ StoreName.Root,"Trusted roots"},
{ StoreName.TrustedPublisher,"Trusted Publishers"}
}.Select(s => new { store = new X509Store(s.Key, StoreLocation.LocalMachine), Location = s.Value }).ToArray();
foreach (var store in stores)
store.store.Open(OpenFlags.ReadOnly);
var list = stores.SelectMany(s => s.store.Certificates.Cast<X509Certificate2>().Select(mCert => new Form1
{
HasPrivateKey = mCert.HasPrivateKey ? "Yes" : "No",
Name = mCert.FriendlyName,
Location = s.Location,
Issuer = mCert.Issuer
})).ToList();
}
}
我在 c# 中使用了 Windows 窗体应用程序。如果我单击该按钮,它必须将本地计算机中存在的可用证书显示在列表框中。但是我不知道如何显示可用的证书。请提出建议。
- 为每个证书创建一个新的 Form1 实例。
- 您不引用任何现有的列表框
试试这个:
public partial class Form1 : Form
{
//declare new listbox
ListBox lbCerts;
public Form1()
{
InitializeComponent();
//add a listbox to the form
lbCerts = new ListBox();
lbCerts.DisplayMember = "Name";
this.Controls.Add(lbCerts);
}
//class represent certificate
class myCer
{
public string Name { get; set; }
public string HasPrivateKey { get; set; }
public string Location { get; set; }
public string Issuer { get; set; }
}
private void button1_Click(object sender, EventArgs e)
{
var stores = new Dictionary<StoreName, string>()
{
{ StoreName.My,"Personal"},
{ StoreName.Root,"Trusted roots"},
{ StoreName.TrustedPublisher,"Trusted Publishers"}
}.Select(s => new { store = new X509Store(s.Key, StoreLocation.LocalMachine), Location = s.Value }).ToArray();
foreach (var store in stores)
store.store.Open(OpenFlags.ReadOnly);
//create list of myCer
var list = stores.SelectMany(s => s.store.Certificates.Cast<X509Certificate2>().Select(mCert => new myCer
{
HasPrivateKey = mCert.HasPrivateKey ? "Yes" : "No",
Name = mCert.FriendlyName,
Location = s.Location,
Issuer = mCert.Issuer
})).ToList();
//populate listbox
lbCerts.DataSource = list;
}
}