2009-03-31 3 views
12

Ich habe eine Windows Forms-Anwendung, die lokal auf dem Desktop des Benutzers ausgeführt wird. Die einzige Möglichkeit, auf das Internet zuzugreifen, besteht darin, System.Diagnostics.Process.Start (url) auszuführen, um den Standardbrowser des Benutzers zu starten und auf verschiedene URLs zu verweisen (um nach Updates zu suchen, uns zu kontaktieren usw.). Und all das passiert nicht, ohne dass der Benutzer dies explizit durch Klicken auf einen Menüpunkt oder eine Schaltfläche anfordert.Was bewirkt, dass die Windows-Firewall eine Anwendung blockiert?

Auf meinem Computer habe ich gelegentlich eine Windows-Firewall-Warnmeldung beim Starten des Programms bekommen, sagen, dass die Windows-Firewall "einige Funktionen" des Programms zum Schutz der Maschine blockiert hat. Ich bekomme diese Warnung auch gelegentlich, wenn ich mein Programm in Visual Studio ausführe (und der Warndialog sagt, dass vshost vom Netzwerk blockiert wurde). Es passiert nicht die ganze Zeit.

Ich habe von keinem meiner Kunden gehört, dass dies auf ihren PCs passiert ist, aber das heißt nicht, dass es nicht ist. Und es ist eine etwas beängstigende Warnung für einen technisch weniger versierten Benutzer, also würde ich gerne herausfinden, wie man es wenn möglich beseitigen kann.

Was könnte mein Programm möglicherweise tun, um diese Warnung auszulösen?

Bearbeiten: Die einzige etwas ungewöhnliche Sache, die mein Programm beim Start tut, ist, dass es die Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase-Klasse verwendet, um eine einzelne Instanz-Anwendung zu erzwingen. Ich weiß, dass dies hinter den Kulissen eine Threading-Magie hervorbringt, um neue Instanzen zu erkennen und umzuleiten. Ist es möglich, dass es aus irgendeinem Grund im Netzwerk hört?

Antwort

7

Die Windows-Firewall wird nur ausgelöst, wenn Ihr Programm einen Port überwacht und somit effektiv als Server fungiert. System.Diagnostics.Process.Start wird Windows-Firewall nicht auslösen.

Stattdessen verursacht WindowsFormsApplicationBase wahrscheinlich die Firewall-Warnung, da WindowsFormsApplicationBase Remoting verwendet, um andere Instanzen von sich selbst zu erkennen. Mit Reflektor, fand ich diesen Code in WindowsFormsApplicationBase.Run():

TcpChannel channel = this.RegisterChannel(secureChannel); 
RemoteCommunicator communicator = new RemoteCommunicator(this, this.m_MessageRecievedSemaphore); 
string uRI = applicationInstanceID + ".rem"; 
new SecurityPermission(SecurityPermissionFlag.RemotingConfiguration).Assert(); 
RemotingServices.Marshal(communicator, uRI); 
CodeAccessPermission.RevertAssert(); 
string uRL = channel.GetUrlsForUri(uRI)[0]; 
this.WriteUrlToMemoryMappedFile(uRL); 
this.m_FirstInstanceSemaphore.Set(); 
this.DoApplicationModel(); 

Solange Sie WindowsFormsApplicationBase für seine SingleInstance Funktion zu verwenden, weiß ich nicht von irgendeiner Weise um dieses.

+0

Das ist die Sache - es gibt nichts, das offensichtlich auf irgendwelche Häfen hört. Die Warnung tritt sowohl in Visual Studio als auch bei der Ausführung der installierten ausführbaren Datei auf. –

+0

Die eine Sache, die ein wenig ungewöhnlich ist, ist, dass ich die Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase verwenden, um eine einzelne Instanzanwendung zu erzwingen. Das macht Threads hinter den Kulissen; Ich frage mich, ob es im Netzwerk für Remoteprozess-Sachen zuhören könnte. –

+1

Öffnen Sie die Eingabeaufforderung und führen Sie "netstat -b" aus, während das Programm ausgeführt wird, um zu sehen, ob es an allen Ports abhört. – Greg