Obtenir que mon application soit autorisée à accéder via un pare-feu à l’aide de c #

J’essaie de faire passer mon application à travers un pare-feu, car je dois utiliser ftp en mode actif et passif, ce n’est pas une option, car les serveurs ne sont pas configurés pour cela. J’ai donc essayé le code ci-dessous qui comstack bien, je l’exécute en utilisant:

MyApp.Classes.INetFwMgr mgr = new MyApp.Classes.INetFwMgr(); mgr.AuthorizeApplication(Application.ProductName, Application.StartupPath, NET_FW_SCOPE_.NET_FW_SCOPE_ALL, NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY); 

Et la classe qui fait le travail:

 private const ssortingng CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}"; private static NetFwTypeLib.INetFwMgr GetFirewallManager() { Type objectType = Type.GetTypeFromCLSID( new Guid(CLSID_FIREWALL_MANAGER)); return Activator.CreateInstance(objectType) as NetFwTypeLib.INetFwMgr; } private const ssortingng PROGID_AUTHORIZED_APPLICATION = "HNetCfg.FwAuthorizedApplication"; public bool AuthorizeApplication(ssortingng title, ssortingng applicationPath, NET_FW_SCOPE_ scope, NET_FW_IP_VERSION_ ipVersion) { // Create the type from prog id Type type = Type.GetTypeFromProgID(PROGID_AUTHORIZED_APPLICATION); INetFwAuthorizedApplication auth = Activator.CreateInstance(type) as INetFwAuthorizedApplication; auth.Name = title; auth.ProcessImageFileName = applicationPath; //Getting Access Denied Exception Here auth.Scope = scope; auth.IpVersion = ipVersion; auth.Enabled = true; NetFwTypeLib.INetFwMgr manager = GetFirewallManager(); try { manager.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(auth); } catch (Exception ex) { return false; } return true; } 

en utilisant le code ci-dessus, mais je reçois l’ Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) c # exception en ligne

 auth.ProcessImageFileName = applicationPath; 

Une idée de ce qu’on peut faire ?

Edit1: Comment pourrais-je l’exécuter en tant qu’administrateur utilisant du code?

Edit2: J’ai aussi essayé de Putting in manifest did not make a difference

Le contexte d’exécution des programmes PSThis peut être Win 7, Vista, XP

La gestion du pare-feu est une fonctionnalité de sécurité au niveau du système et doit être effectuée en dehors du code d’application en mode utilisateur. La configuration doit être effectuée par un administrateur.

Il est déconseillé d’écrire le code que vous avez écrit et de supposer que votre application sera exécutée en tant qu’administrateur. Même s’il est exécuté par un administrateur, vous avez maintenant une application qui “fait des trucs FTP” et “fait des trucs de pare-feu”. Aucune application n’a jamais été écrite comme ça.

Vous pouvez écrire du code qui interagit avec le pare-feu du système. Ce code doit être exécuté avec des permissions élevées. Généralement, de telles “applications auxiliaires” ne sont jamais créées, cependant, Windows (et tous les autres systèmes d’exploitation) disposant de tous les outils de gestion nécessaires livrés avec le système d’exploitation (par exemple, wf.msc ).

J’ai observé que si je modifie l’ordre des instructions de téléchargement FTP dans la fenêtre suivante, la boîte de dialog suivante s’affiche vous demandant si do you want to allow this program access through firewall . si je clique sur autoriser l’access, le code fonctionne parfaitement.

 requestDownload = (FtpWebRequest)WebRequest.Create(uri); requestDownload.UsePassive = false; requestDownload.KeepAlive = false; requestDownload.UseBinary = true; requestDownload.Method = WebRequestMethods.Ftp.DownloadFile; requestDownload.Credentials = new NetworkCredential(ftpInfoDownload[3], ftpInfoDownload[4]); responseDownload = (FtpWebResponse)requestDownload.GetResponse(); Stream ftpStream = responseDownload.GetResponseStream(); 

Essayez d’ouvrir les ports FTP du pare-feu – ports 20 et 21 – et voyez si cela résout votre problème.

Pour exécuter en tant qu’utilisateur différent: Code d’ exécution en tant qu’utilisateur différent (C #)

Pour passer le pare-feu, avez-vous parlé à la personne / au groupe responsable de la sécurité du pare-feu? Ils peuvent avoir des règles en place que vous pourriez utiliser.