Guten Tag,
ich steh momentan vor einem eher seltsamen Problem. Ich versuche in den X509-Store eines PCs ein selbst signiertes Zertifikat für eine SSL-Verbindung einzuschleusen. Für diesen Vorgang werden Adminrechte benötigt. Aus diesem Grund prüfen ich in meinem Programm ob es mit Adminrechten ausgeführt wurde. Wenn nicht startet es erneut mit der Bitte nach Adminrechten, versucht dann das Zertifikat zu erstellen und es zu "installieren".
Wenn ich das Programm nun normal starte sagt es mir es benötige Adminrechte und es startet sich dann neu. Sobald ich ihm Adminrechte gewähren erscheint die Oberfläche, ein Command-Fenster erscheint (der Befehl für die Zertifikatserstellung wird ausgeführt) und schließt sich danach. Ich muss aber feststellen, das das Zertifikat nicht in den Store geschrieben wurde.
Wenn ich aber Visual Studio 2010 mit Adminrechten starte und dann mein Programm ausführe wird das Zertifikat ohne meckern erstellt.
Ich weiß leider nicht wo das Problem liegt. Vielleicht hat einer von euch schonmal mit einem ähnlichen Problem zu kämpfen gehabt. Ich hoffe ihr könnt mir helfen.
Hier noch mein Codeteil:
if (!this.serverData.ExistsServerCertificate())
{
if (!IsAdmin())
{
System.Windows.Forms.MessageBox.Show("Für den weiteren Programmablauf sind Adminrechte notwendig.\r\nDiese Adminrechte werden einmalig für die Erstellung des SSL-Zertifikates benötigt. Nach der Zertifikatserstellung kann das Programm ohne Adminrechte betrieben werden.\r\n\r\nDas Programm startet sich nun mit Adminrechten neu.", "Fehler: ");
RestartElevated();
}
else this.serverData.MakeServerCertificate();
}
public bool ExistsServerCertificate()
{
X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, "CN=WhoChat", false);
store.Close();
if (certificates.Count == 0) return false;
else return true;
}
public void MakeServerCertificate()
{
AddLogMessage("Zertifikat nicht gefunden");
File.WriteAllBytes("makecert.exe", WhoChat.Properties.Resources.makecert);
Process.Start("cmd.exe", "/c makecert -sr LocalMachine -ss root -r -n \"CN=WhoChat\" -sky exchange -sk 123456");
AddLogMessage("Zertifikat neu erstellt");
File.Delete("makecert.exe");
}
private void RestartElevated()
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
startInfo.Verb = "runas";
try
{
Process p = Process.Start(startInfo);
}
catch (System.ComponentModel.Win32Exception ex)
{
this.serverData.AddLogMessage(ex.ToString());
return;
}
Environment.Exit(2);
}
Dürfte daran liegen, dass Du das WorkingDirectory
bei Process.Start("cmd...
" nicht setzt.
Ähnliches Thema hatten wir neulich erst und ist ein häufiges Problem beim Aufruf der cmd.exe über C#.
Warum startest Du aber nicht die Ziel-Exe direkt, sondern gehst den cmd-exe-Umweg?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hm, den umweg über die cmd.exe gehe ich weil ich es noch nie anderst probiert habe 😃
Ich werde mal versuchen deine angesprochene Methode zu verwenden.
Nichtsdestotrotz, wäre dies hier so richtig ?
public void MakeServerCertificate()
{
AddLogMessage("Zertifikat nicht gefunden");
File.WriteAllBytes("makecert.exe", WhoChat.Properties.Resources.makecert);
ProcessStartInfo pInfo = new ProcessStartInfo();
pInfo.FileName = "cmd.exe";
pInfo.Arguments = "/c makecert -sr LocalMachine -ss root -r -n \"CN=WhoChat\" -sky exchange -sk 123456";
pInfo.WorkingDirectory = @"C:\Windows\System32\";
Process.Start(pInfo);
AddLogMessage("Zertifikat neu erstellt");
File.Delete("makecert.exe");
}
Ausprobiern 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Wunderbar, dankeschön 😃
Das Zertifikat wird nun ohne Probleme erstellt.