Разрешить моему приложению доступ через брандмауэр с помощью c #

Я пытаюсь разрешить мое приложение через брандмауэр, так как мне нужно использовать 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: Я тоже пробовал Putting <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> in manifest did not make a difference

P.S. Это контекст выполнения программ может быть Win 7, vista, xp


person PUG    schedule 22.12.2011    source источник
comment
К вашему сведению, такого понятия, как C # .net, не существует.   -  person John Saunders    schedule 21.12.2011
comment
Каков контекст выполнения этого кода? Обычная программа, конечно, может не просто принудительно открыть брандмауэр, но и лишить его смысла. По крайней мере, потребуются права администратора, которые вы обычно получаете только в установщике. В сценарии с сервером вы определенно хотите предоставить администратору локальной сети явное предоставление доступа.   -  person Hans Passant    schedule 22.12.2011


Ответы (4)


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

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

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

person mattypiper    schedule 22.12.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();
person PUG    schedule 23.12.2011

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

person hypercode    schedule 21.12.2011
comment
В брандмауэре Windows вы можете вручную добавить свою программу в список разрешенных (ищите Разрешить программу или функцию через брандмауэр Windows) или вручную переопределить определенные порты TCP / IP (обычно это расширенная настройка). Это будет зависеть от версии Windows, которую вы используете, какой вариант проще всего настроить. - person hypercode; 22.12.2011
comment
Я добавил правило к брандмауэру, чтобы разрешить соединения на 20, 21, но запрос ftp все еще истекает - person PUG; 22.12.2011
comment
но я разрешил программу через брандмауэр, это сработало, есть ли у вас какие-либо предложения по разрешению моей программы через брандмауэр с использованием кода, поскольку я публикую только код, и программа устанавливается сама по себе на каждую клиентскую систему. как бы я сделал это только так, чтобы он только добавлял его один раз - person PUG; 22.12.2011
comment
Посмотрите ответ Грега на этот вопрос - он должен помочь вам делать то, что вы хотите, с брандмауэром: stackoverflow.com/questions/1242566/ - person hypercode; 22.12.2011

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

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

person Wayne In Yak    schedule 22.12.2011
comment
Я хочу сделать это программно, разрешить доступ .exe через брандмауэр - person PUG; 22.12.2011
comment
@jaminator - Очевидно, это то, что вам нужно, но действительно ли это этично? - person M.Babcock; 22.12.2011
comment
Вы правильно знаете назначение брандмауэра? Чтобы остановить несанкционированный доступ. Вы можете запускать код для другого использования, но не имеет значения, заблокировано ли то, куда вы пытаетесь перейти, на уровне порта / ACL. В этом вам может помочь администратор локальной сети. Есть ли причина, по которой вы не хотите разговаривать с администратором локальной сети / брандмауэра? - person Wayne In Yak; 22.12.2011