Получить мое приложение, чтобы разрешить доступ через брандмауэр с помощью C # - PullRequest
1 голос
/ 22 декабря 2011

Я пытаюсь разрешить моему приложению доступ через брандмауэр, так как мне приходится использовать ftp в активном и пассивном режиме, а это не вариант, так как серверы не настроены для этого.поэтому я попробовал приведенный ниже код, который прекрасно компилируется, я его извиняю, используя:

 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);

И класс, который выполняет работу:

private const string 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 string PROGID_AUTHORIZED_APPLICATION = 
"HNetCfg.FwAuthorizedApplication"; 
public bool AuthorizeApplication(string title, string 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; 
}

, используя приведенный выше код, но я получаю Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) c # исключение в строке

auth.ProcessImageFileName = applicationPath;

есть идеи, что делать?

Edit1: Как бы я запустил это как администратор, используя код?

Edit2: Iтакже пробовал Putting <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> in manifest did not make a difference

PSTЭтот контекст выполнения программы может быть Win 7, Vista, XP

Ответы [ 4 ]

1 голос
/ 23 декабря 2011

я заметил, что если я изменю порядок операторов загрузки ftp на следующее окно, появится диалоговое окно с запросом do you want to allow this program access through firewall; если я нажимаю разрешить доступ, код работает отлично.

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();
1 голос
/ 23 декабря 2011

Управление брандмауэром - это функция безопасности на уровне системы, которая должна выполняться вне кода приложения в пользовательском режиме. Настройка должна быть выполнена администратором.

Неправильно писать код, который вы написали, и предполагать, что ваше приложение будет запускаться от имени администратора. Даже если он запущен администратором, у вас теперь есть приложение, которое «выполняет работу с FTP» и «выполняет работу с брандмауэром». Ни одна заявка никогда не была написана так.

Вы можете написать код, который взаимодействует с системным брандмауэром, и этот код должен выполняться с повышенными разрешениями. Обычно такие «вспомогательные приложения» даже никогда не создаются, поскольку Windows (и любая другая ОС) имеет все необходимые инструменты управления, поставляемые с ОС (т. Е. wf.msc).

0 голосов
/ 22 декабря 2011

Для работы от имени другого пользователя: Запуск кода от имени другого пользователя (C #)

Что касается прохождения через брандмауэр, поговорили ли вы с лицом / группой, ответственным за брандмауэрбезопасность?У них могут быть некоторые правила, которые вы можете использовать.

0 голосов
/ 21 декабря 2011

Попробуйте открыть порты FTP в брандмауэре - порты 20 и 21 - и посмотрите, решит ли это вашу проблему.

...