Как я могу определить, включен ли продукт брандмауэра?
Как я могу определить (из приложения Windows Forms, написанного на C#), включен ли продукт брандмауэра?
Вот мой код, и я получаю сообщение об ошибке на INetFwMgr, что тип или пространство имен не может быть найден
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private const string CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}";
INetFwMgr manager = GetFireWallManager();
bool isFirewallEnabled = manager.LocalPolicy.CurrentProfile.FirewallEnabled;
private static INetFwMgr GetFireWallManager()
{
Type objectType = Type.GetTypeFromCLSID(new Guid(CLSID_FIREWALL_MANAGER));
return Activator.CreateInstance(objectType) as INetFwMgr;
}
private void button1_Click(object sender, EventArgs e)
{
if (isFirewallEnabled == false)
{
MessageBox.Show("Firewall is not enabled.");
}
else
{
MessageBox.Show("Firewall is enabled.");
}
}
}
}
6 ответов
Я знаю, что это старый пост, но я нашел отличное решение!
Прочтите раздел реестра состояния брандмауэра, который находится в:
HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ SharedAccess \ Параметры \FirewallPolicy\StandardProfile
Ключ: EnableFirewall
public static bool isFirewallEnabled() {
try {
using (RegistryKey key = Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile")) {
if (key == null) {
return false;
} else {
Object o = key.GetValue("EnableFirewall");
if (o == null) {
return false;
} else {
int firewall = (int)o;
if (firewall == 1) {
return true;
} else {
return false;
}
}
}
}
} catch {
return false;
}
}
Также вы можете получить значения для DomainProfile, PublicProfile и StandardProfile. Вы также можете получить FirewallRules.
Надеюсь, это поможет:)
NetFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false);
INetFwMgr mgr = (INetFwMgr)Activator.CreateInstance(NetFwMgrType);
bool Firewallenabled = mgr.LocalPolicy.CurrentProfile.FirewallEnabled;
Подробности смотрите по ссылке.
http://technet.microsoft.com/en-us/library/cc737845%28WS.10%29.aspx
Посмотрите на этот вопрос об антивирусе. Как обнаружить антивирус, установленный на Windows 2003 Server и 2008 Server 2003 Server R2 и 2008 Server R2, используя WMI или другой WMI в C++, тот же вызов API можно использовать для определения настроек брандмауэра с помощью WSC_SECURITY_PROVIDER_FIREWALL
ENUM. Ответ на этот вопрос на самом деле неправильный, но он даст вам ответ для несерверных компьютеров. Этот код написан на C++, но вам нужен только вызов Windows API, вы также можете вызывать его из C#.
Просто импортируйте ссылки из C://windows/system32/hnetcfg.dll и C://windows/system32/FirewallAPI.dll
затем используйте
using NATUPNPLib;
using NETCONLib;
using NetFwTypeLib;
Сначала вам нужно добавить следующий компонент в ваш проект
- INetFwMgr
Затем получите тип объекта из CLSID диспетчера конфигурации домашней сети, который {304CE942-6E39-40D8-943A-B913C40C9CD4}
(Ссылки на C:\WINDOWS\system32\hnetcfg.dll
и можно найти на HKEY_CLASSES_ROOT\CLSID\{304CE942-6E39-40D8-943A-B913C40C9CD4}
) и использовать собранный тип для создания экземпляра с использованием конструктора по умолчанию типа в качестве нового INetFwMgr
который будет использоваться для определения, включен ли межсетевой экран или нет INetFwMgr.LocalPolicy.CurrentProfile.FirewallEnabled
который возвращает bool
private const string CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}"; //This is the CLSID of Home Networking Configuration Manager. We'll use this to detect whether the Firewall is enabled or not
private static NetFwTypeLib.INetFwMgr GetHNCMType()
{
Type objectType = Type.GetTypeFromCLSID(new Guid(CLSID_FIREWALL_MANAGER)); //Creates a new GUID from CLSID_FIREWALL_MANAGER getting its type as objectType
return Activator.CreateInstance(objectType) as NetFwTypeLib.INetFwMgr; //Creates an instance from the object type we gathered as an INetFwMgr object
}
static void Main(string[] args)
{
INetFwMgr manager = GetHNCMType(); //Initializes a new INetFwMgr of name manager from GetHNCMType
if (manager.LocalPolicy.CurrentProfile.FirewallEnabled == false) //Continue if the firewall is not enabled
{
//The firewall is not enabled
Console.WriteLine("OFF"); //Writes OFF to the Console in a new line
}
else //Otherwise:
{
//The fire wall is enabled
Console.WriteLine("ON"); //Writes ON to the Console in a new line
}
}
Спасибо,
Я надеюсь, что вы найдете это полезным:)
Чтобы добавить компонент в свой проект,
- Щелкните правой кнопкой мыши Ссылки в обозревателе решений под названием проекта и выберите Добавить ссылку...
- На вкладке COM выберите компонент, который вы хотите добавить, и нажмите OK
Вы можете использовать FwMgr для старых версий Windows (XP) и использовать брандмауэр Windows с API расширенной безопасности для Vista и выше.
Вот пример, который возвращает настройки брандмауэра.