Hallo zusammen!
Ich habe das Problem, das ich eine Exception "Fehler beim Initialisieren: Während eriner Pinganforderung ist eine Ausnahme aufgetreten." bekomme, wenn ich das Programm über eine Netzwerkfreigabe (\computer\freigabe\programm.exe) aufrufe.
Kopiere ich das Programm auf eine lokale Festplatte klappt es ohne Probleme.
Das Programm soll prüfen, ob ein SQL-Server auf einen Ping anwortet, bevor eine SQL-Verbindung aufgebaut wird.
using System.Net;
using System.Net.NetworkInformation;
// [...]
try
{
Ping myPing = new Ping();
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions(64, true);
PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
if (reply.Status == IPStatus.Success)
MessegBox.Show("Ping OK");
}
catch (Exception ex)
{
MessageBox.Show("Fehler beim Initialisieren: " + ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
Ich würde mich sehr freuen, wenn mir jemand helfen könnte, dieses Problem zu lösen.
Vielen Dank.
mfg Philipp Nicolai
Ich habe folgende Zeile ersetzt:
MessageBox.Show("Fehler beim Initialisieren: " + ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show("Fehler beim Initialisieren:\n\n" + ex.Message + "\n\n" + ex.InnerException, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
Durch die Information von ex.InnerException sind deutlich mehr Informationen vorhanden:
System.Security.SecurityException: Fehler bei der Anforderung des Benachrichtigungstyps System.Net.DnsPermissen, System, Version 2.0.0.0
[...]
Die Aktion, bei der ein Fehler aufgetreten ist:
Demand
Der Typ der ersten Berechtigung, bei der ein Fehler augetreten ist:
System.Net.DnsPermission
Die Zone der Assembly, bei der ein Fehler aufgetreten ist:
Internet
Jedoch gebe ich eine IP an, und keine URL bzw. Hostnamen. Die IP ist im Lokalen Netzwerk (LAN).
Fang doch mal eine typisierte Exception (also direkt ne SecurityException) und guck dir die FirstPermissionThatFailed an. Also es bedeutet ja schonmal, dass du irgendwelche Rechte, die du für die Ausführung deiner Methode brauchst, nicht hast.
Hoffe das hilft dir ein bisschen weiter.
Gruß
Corpsegrinder
Die Catchanweisung wirft leider keine Messagebox
catch ( System.Security.SecurityException ey)
{
MessageBox.Show("Fehler Security:\n\n" + ey.FirstPermissionThatFailed + "", "Es ist eine Ausnahme aufgetreten", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
Wenn ich in der Config vom Ausführenden PC die Rechte im .NET Framework änder, und damit Zugriffe über das Netzerk zulasse klappt das.
Kann ich irgenwie prüfen ob das Programm die nötigen Rechte auf dem Ausführenden Computer hat? Denn ich prüfe in einer Anwendung diverse Dinge. Da würde ich das dann beim Startup Mitprüfen lassen.
mfg Philipp Nicolai
[EDIT=herbivore]Threads zusammengefügt[/EDIT]
Ich habe mir die FAQ zur Ausführung auf Netzlaufwerken schon durchgelesen.
[FAQ] Anwendung von Netzlaufwerk starten
Ich möchte jedoch in meiner .NET Framework 2.0 Anwendung beim Starten prüfen, ob das entsprechende Recht vorhanden ist.
Sollte dies nicht der Fall sein, so möchte ich gerne via Exception eine Vernünftige Infomeldung ausgeben können.
Kann mir jemand sagen wie ich das prüfen könnte?
Vielen Dank.
mfg Philipp Nicolai
Hallo Philipp,
wenn Du keine Rechte auf dem Netzwerklaufwerk hast, um ein .NET Programm zu starten, dann kannst Du auch kein Programm in .NET ausführen, das dem Anwender sagt, dass er zuwenig Rechte hat.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Ich habe das Problem, dass das Programm startet, aber bei einem Ping eine Exception wirft, da der Ping-command keine nötigen rechte hat.
Wenn ich versuche die Exception seperat zu erfassen gelingt mir das leider nicht.
Erst dachte ich, das es mit dem Pingcommand zu tuen hatte, daher habe ich erst hier das Problem beschrieben:
Ping Problem via Netzwerkfreigabe
Ich hoffe, das dort mein Problem detalierter beschrieben ist.
So klappt es nun - warum auch immer:
catch (System.Security.SecurityException ey)
{
MessageBox.Show("Fehler Security:\n\nDie Rechte dieses Computers verhindern die Ausführung von einem Netzlaufwerk!\nBitte wenden Sie sich an Ihren Administrator.\nMögliche Lösung: CasPol.exe -q -m -ag 1.2 -url file:\\\\server\\dir\\ FullTrust\n\nDas Programm wird nun beendet.", "Es ist eine Ausnahme aufgetreten", MessageBoxButtons.OK, MessageBoxIcon.Error);
statusok = false;
}
catch (Exception ex)
{
MessageBox.Show("Fehler beim Initialisieren:\n\n" + ex.Message + "\n\n" + ex.InnerException + "\n\n" + ex.HelpLink , "Es ist eine Ausnahme aufgetreten", MessageBoxButtons.OK, MessageBoxIcon.Error);
statusok = false;
}
Je höher die Vererbungstiefe desto höher muss die Exception stehen.
Bei Catch-Blöcken musst du zwingend auf die Reihenfolge achten. Die Basis-Klasse System.Exception muss als letzter Blöck angegeben werden, da drüber die jeweiligen abgeleiteten Klassen.
Eventuell macht es auch Sinn
bool statusOK = false;
try{
// Kritischer Code
statusOK = true
}
catch (System.xyz){
//Messagebox
}
catch (System.Exception ex){
//Log this
throw; //Wichtig bei unbekannten Exceptions weiterwerfen
}
return statusOK;
zu verwenden.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...