2009-03-31 9 views
12

J'ai une application Windows Forms qui s'exécute localement sur le bureau de l'utilisateur. La seule façon d'accéder à Internet consiste à lancer System.Diagnostics.Process.Start (url) pour lancer le navigateur par défaut de l'utilisateur et le diriger vers différentes URL (pour vérifier les mises à jour, contactez-nous, etc.). Et rien de tout cela ne se produit sans que l'utilisateur ne le demande explicitement en cliquant sur un élément de menu ou un bouton.Pourquoi le pare-feu Windows bloque-t-il une application?

Sur mon ordinateur, j'ai parfois reçu un message d'avertissement du Pare-feu Windows lors du démarrage du programme, indiquant que le Pare-feu Windows avait "bloqué certaines fonctions" du programme pour protéger la machine. Je reçois aussi occasionnellement cet avertissement lors de l'exécution de mon programme dans Visual Studio (et la boîte de dialogue d'avertissement indique que vshost a été bloqué du réseau). Cela n'arrive pas tout le temps.

Aucun de mes clients ne m'a dit que cela se passait sur leur PC, mais cela ne veut pas dire que ce n'est pas le cas. Et c'est un avertissement un peu effrayant à un utilisateur moins techniquement avertis, donc je voudrais savoir comment l'éliminer si possible.

Que pourrait faire mon programme pour déclencher cet avertissement?

Modifier: La seule chose inhabituelle que fait mon programme au démarrage est qu'il utilise la classe Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase pour appliquer une application d'instance unique. Je sais que cela fait un peu de magie en coulisse pour détecter de nouvelles instances et les rediriger. Est-il possible qu'il écoute sur le réseau pour une raison quelconque?

Répondre

7

Windows Le pare-feu ne sera déclenché que si votre programme écoute sur un port, agissant comme un serveur. System.Diagnostics.Process.Start ne déclenchera pas le pare-feu Windows. Au lieu de cela, WindowsFormsApplicationBase provoque probablement l'avertissement de pare-feu, car WindowsFormsApplicationBase utilise l'accès distant pour détecter d'autres instances de lui-même. En utilisant le réflecteur, je trouve ce code dans 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(); 

Tant que vous utilisez pour WindowsFormsApplicationBase sa fonction de SingleInstance, je ne sais pas de toute façon de contourner cela.

+0

C'est la chose - il n'y a rien qui est évidemment à l'écoute sur tous les ports. L'avertissement se produit à la fois dans Visual Studio et lorsque j'exécute l'exécutable installé. –

+0

La seule chose qui est un peu inhabituelle est que j'utilise Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase pour appliquer une application d'instance unique. Cela enfile des choses dans les coulisses; Je me demande si cela pourrait être l'écoute sur le réseau pour les processus à distance. –

+1

Ouvrez l'invite de commande et exécutez "netstat -b" pendant que le programme est en cours d'exécution pour voir s'il écoute sur tous les ports. – Greg

Questions connexes