如何enable/disable防火墙?
How to enable/disable Firewall?
INetFwPolicy2 接口允许应用程序或服务访问防火墙策略。
我正在使用 visual studio 2017.
问题与此有关
代码略有不同,我无法禁用防火墙。
关闭防火墙之前的逻辑没问题。
public Task<StatusCodeResult> ResetFirewallStatus()
{
Type netFwPolicy2Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
dynamic mgr = Activator.CreateInstance(netFwPolicy2Type);
var fwCurrentProfileTypes = mgr.CurrentProfileTypes;
// Get current status
bool firewallEnabled = mgr.FirewallEnabled(fwCurrentProfileTypes); // return true
// Disables Firewall
mgr.FirewallEnabled(false); //breaks here !!!!
return Task.FromResult<StatusCodeResult>(Ok());
}
错误信息是:
System.ArgumentException: 'Value does not fall within the expected
range.'
我尝试使用 set_FirewallEnabled(fwCurrentProfileTypes,false);
还有put_FirewallEnabled(fwCurrentProfileTypes,false)
在这种情况下错误是:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:
''System.__ComObject' does not contain a definition for
'set_FirewallEnabled'' ('put_FirewallEnabled'')
编辑
我的解决方案:
const int domainProfile = 1;
const int privateProfile = 2;
const int publicProfile = 4;
public bool EnableDisableFirewall(bool enableFirewall)
{
dynamic mgr = getFwPolicy2();
mgr.FirewallEnabled[domainProfile] = enableFirewall;
mgr.FirewallEnabled[privateProfile] = enableFirewall;
mgr.FirewallEnabled[publicProfile] = enableFirewall;
return enableFirewall;
}
public bool IsFirewallOn()
{
dynamic mgr = getFwPolicy2();
// Get current status
var isDomainProfileEnabled = mgr.FirewallEnabled(domainProfile);
var isPrivateProfileEnabled = mgr.FirewallEnabled(privateProfile);
var isPublicProfileEnabled = mgr.FirewallEnabled(publicProfile);
return isDomainProfileEnabled && isPrivateProfileEnabled && isPublicProfileEnabled;
}
private object getFwPolicy2()
{
Type netFwPolicy2Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
dynamic mgr = Activator.CreateInstance(netFwPolicy2Type);
return mgr;
}
你有两个问题,后期绑定编写这段代码并不能完全帮助解决这个问题。添加对 c:\windows\system32\firewallapi.dll 的引用,这样您就可以直接使用 INetFwPolicy2 接口,这有助于您正确处理。您遇到的一个问题是 FirewallEnabled 属性 是 indexed 属性。 C# 语言中没有等效项。 Anyhoo,后期绑定需要:
bool firewallEnabled = mgr.FirewallEnabled(fwCurrentProfileTypes);
MSDN 文档对此有特别警告,您不能使用 CurrentProfileTypes 返回的值。它需要指定 specific profile。我推荐你使用:
int profile = 2; // 1=domain, 2=private, 4=public
bool firewallEnabled = mgr.FirewallEnabled[profile];
注意 [尖括号] 的使用,允许在 COM 实现的属性的特定情况下用于索引属性。
mgr.FirewallEnabled(false); //breaks here !!!!
您必须 select 要禁用的特定配置文件。正确的语法如下:
mgr.FirewallEnabled[profile] = false;
请注意,只有当您的程序以管理员权限运行时,您才能修补防火墙。如果您还没有添加 required manifest,请添加。
INetFwPolicy2 接口允许应用程序或服务访问防火墙策略。
我正在使用 visual studio 2017.
问题与此有关
代码略有不同,我无法禁用防火墙。
关闭防火墙之前的逻辑没问题。
public Task<StatusCodeResult> ResetFirewallStatus()
{
Type netFwPolicy2Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
dynamic mgr = Activator.CreateInstance(netFwPolicy2Type);
var fwCurrentProfileTypes = mgr.CurrentProfileTypes;
// Get current status
bool firewallEnabled = mgr.FirewallEnabled(fwCurrentProfileTypes); // return true
// Disables Firewall
mgr.FirewallEnabled(false); //breaks here !!!!
return Task.FromResult<StatusCodeResult>(Ok());
}
错误信息是:
System.ArgumentException: 'Value does not fall within the expected range.'
我尝试使用 set_FirewallEnabled(fwCurrentProfileTypes,false);
还有put_FirewallEnabled(fwCurrentProfileTypes,false)
在这种情况下错误是:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''System.__ComObject' does not contain a definition for 'set_FirewallEnabled'' ('put_FirewallEnabled'')
编辑
我的解决方案:
const int domainProfile = 1;
const int privateProfile = 2;
const int publicProfile = 4;
public bool EnableDisableFirewall(bool enableFirewall)
{
dynamic mgr = getFwPolicy2();
mgr.FirewallEnabled[domainProfile] = enableFirewall;
mgr.FirewallEnabled[privateProfile] = enableFirewall;
mgr.FirewallEnabled[publicProfile] = enableFirewall;
return enableFirewall;
}
public bool IsFirewallOn()
{
dynamic mgr = getFwPolicy2();
// Get current status
var isDomainProfileEnabled = mgr.FirewallEnabled(domainProfile);
var isPrivateProfileEnabled = mgr.FirewallEnabled(privateProfile);
var isPublicProfileEnabled = mgr.FirewallEnabled(publicProfile);
return isDomainProfileEnabled && isPrivateProfileEnabled && isPublicProfileEnabled;
}
private object getFwPolicy2()
{
Type netFwPolicy2Type = Type.GetTypeFromProgID("HNetCfg.FwPolicy2");
dynamic mgr = Activator.CreateInstance(netFwPolicy2Type);
return mgr;
}
你有两个问题,后期绑定编写这段代码并不能完全帮助解决这个问题。添加对 c:\windows\system32\firewallapi.dll 的引用,这样您就可以直接使用 INetFwPolicy2 接口,这有助于您正确处理。您遇到的一个问题是 FirewallEnabled 属性 是 indexed 属性。 C# 语言中没有等效项。 Anyhoo,后期绑定需要:
bool firewallEnabled = mgr.FirewallEnabled(fwCurrentProfileTypes);
MSDN 文档对此有特别警告,您不能使用 CurrentProfileTypes 返回的值。它需要指定 specific profile。我推荐你使用:
int profile = 2; // 1=domain, 2=private, 4=public
bool firewallEnabled = mgr.FirewallEnabled[profile];
注意 [尖括号] 的使用,允许在 COM 实现的属性的特定情况下用于索引属性。
mgr.FirewallEnabled(false); //breaks here !!!!
您必须 select 要禁用的特定配置文件。正确的语法如下:
mgr.FirewallEnabled[profile] = false;
请注意,只有当您的程序以管理员权限运行时,您才能修补防火墙。如果您还没有添加 required manifest,请添加。