L'automatisation de Pare-feu Windows avec
J'ai le C# une Application qui utilise le PORT 777 pour la communication asynchrone et le PORT 3306 pour la communication avec Mon Serveur Sql. Les problèmes surviennent lorsque les ports est bloqué par un pare-feu. J'ai essayé de créer un programme pour ajouter une exception dans la liste du pare-feu de Windows 7.
Quand je lance le programme, j'obtiens bug comme suit: "l'échec Catastrophique (Exception de HRESULT: 0x8000FFFF (E_UNEXPECTED))".
Je ne comprends pas ce que ces erreurs veux dire, toute suggestion est la bienvenue, Merci.
protected internal void AddExceptionToFirewall(){
try {
INetFwMgr fireWall = null;
INetFwAuthorizedApplications apps = null;
INetFwAuthorizedApplication app = null;
Type progID = null;
INetFwOpenPorts ports = null;
INetFwOpenPort asyncPort = null;
INetFwOpenPort mysqlPort = null;
bool appFounded = false;
bool asyncPortFounded = false;
bool mysqlPortFounded = false;
progID = Type.GetTypeFromProgID("HNetCfg.FwMgr");
//checking for Windows Firewall
fireWall = (INetFwMgr)Activator.CreateInstance(progID);
if (fireWall.LocalPolicy.CurrentProfile.FirewallEnabled) {
//obtain the list of authorized applications
apps = (INetFwAuthorizedApplications)fireWall.LocalPolicy.CurrentProfile.AuthorizedApplications;
IEnumerator appEnumerate = apps.GetEnumerator();
while (appEnumerate.MoveNext()){
app = (INetFwAuthorizedApplication)appEnumerate.Current;
if (app.Name == Application.ProductName){
appFounded = true;
break;
}
}
//add this application to the list of authorized applications
if(appFounded==false){
app.Name = Application.ProductName;
StringBuilder strBuild = new StringBuilder();
strBuild.Append(Application.ExecutablePath.Replace("\\","\\\\"));
app.ProcessImageFileName = strBuild.ToString();
app.Enabled = true;
apps = (INetFwAuthorizedApplications)fireWall.LocalPolicy.CurrentProfile.AuthorizedApplications;
apps.Add(app);
}
//obtain the list of authorized asynchronous socket ports (777)
ports = (INetFwOpenPorts)fireWall.LocalPolicy.CurrentProfile.GloballyOpenPorts;
IEnumerator portEnumerate = ports.GetEnumerator();
while (portEnumerate.MoveNext()) {
asyncPort = (INetFwOpenPort)portEnumerate.Current;
if (asyncPort.Port == 777) {
asyncPortFounded = true;
break;
}
}
//add a port 777 to globally open ports
if (asyncPortFounded==false)
ports.Add(asyncPort);
//obtain the list of authorized mysql socket ports(3306)
while (portEnumerate.MoveNext()) {
mysqlPort = (INetFwOpenPort)portEnumerate.Current;
if (mysqlPort.Port == 3306) {
mysqlPortFounded = true;
break;
}
}
//add a port 3306 to globally open ports
if (mysqlPortFounded == false)
ports.Add(mysqlPort);
}
}
catch (COMException cm) {
MessageBox.Show(cm.Message);
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
- Est-il un "intérieure bug' (exception interne)?
Vous devez vous connecter pour publier un commentaire.
http://www.codeproject.com/Articles/14906/Open-Windows-Firewall-During-Installation
Avant d'utiliser le programme ci-dessous, veuillez ajouter une référence FirewallAPI.dll pour Visual Studio 2010.
Procédez de la manière suivante:
Cliquez-droit sur le Projet de la l'Explorateur de solutions de Visual Studio 2010 - Sélectionnez le Ajouter une Référence - Sélectionnez C:\Windows\System32\FirewallAPI.dll - Ok
L'appel de programme de pare-feu avec 3 ligne de code ci-dessous. Vous pouvez placer ce code dans le formulaire de charge de votre programme:
/* L'automatisation des Pare-feu Windows avec C# prise en charge de Windows 7 */
La accepté de répondre par Javanais Fille avait un C-comme la mise en œuvre avec une declare-utilisation-patron gratuit, et code redondant. Voici une refonte de la mise en œuvre basée sur la réponse. Il utilise tout de même des appels en FirewallAPI.dll; il est fonctionnellement équivalent, de sorte qu'il résout la question d'origine d'un problème de ne pas être en mesure d'obtenir ces sortes de pare-feu opérations de travail. Cette solution dispose d'une interface simple qui cache tous les détails: IsPortOpen, OpenPort, et ClosePort.
Exemple D'Utilisation:
Mise en œuvre:
Je suis arrivé ici via Google recherche d'un .net la méthode de l'inscription du Pare-feu Windows d'ouvrir des ports. Les réponses décrites ci-dessus ne fonctionne pas. Plus précisément le pare-feu.LocalPolicy.CurrentProfile.GloballyOpenPorts toujours eu un nombre de zéro. Ces réponses sont vieux et peut très bien s'appliquer à Windows 7. Ce qui a fonctionné pour moi sur Windows 10 a été présent code.
Je n'ai pas besoin d'ouvrir ou de fermer les Ports, mais il peut être fait en changeant la règle de statut, ou de créer de nouvelles règles et de les activer. Espérons que cela sauve quelqu'un d'autre quelques heures.