我想运行一些代码,它告诉我防火墙是打开还是关闭,用于公共和私人网络。要做到这一点,我在CMD中运行“netsh advfirewall show allprofiles”命令,将输出放入一个字符串,现在我想要剪切它,这样我就可以获得公共和私有防火墙的状态。这是我将其保存在字符串中的代码:
TextBox TxtResult = new TextBox();
string Command = "netsh advfirewall show allprofiles";
System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + Command);
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
TxtResult.Text += proc.StandardOutput.ReadToEnd();
并提供以下字符串:
netsh advfirewall show allprofiles
Domain Profile Settings:
----------------------------------------------------------------------
State ON
Firewall Policy BlockInbound,AllowOutbound
LocalFirewallRules N/A (GPO-store only)
LocalConSecRules N/A (GPO-store only)
InboundUserNotification Enable
RemoteManagement Disable
UnicastResponseToMulticast Enable
Logging:
LogAllowedConnections Disable
LogDroppedConnections Disable
FileName %systemroot%\system32\LogFiles\Firewall\pfirewall.log
MaxFileSize 4096
Private Profile Settings:
----------------------------------------------------------------------
State ON
Firewall Policy BlockInbound,AllowOutbound
LocalFirewallRules N/A (GPO-store only)
LocalConSecRules N/A (GPO-store only)
InboundUserNotification Enable
RemoteManagement Disable
UnicastResponseToMulticast Enable
Logging:
LogAllowedConnections Disable
LogDroppedConnections Disable
FileName %systemroot%\system32\LogFiles\Firewall\pfirewall.log
MaxFileSize 4096
Public Profile Settings:
----------------------------------------------------------------------
State ON
Firewall Policy BlockInbound,AllowOutbound
LocalFirewallRules N/A (GPO-store only)
LocalConSecRules N/A (GPO-store only)
InboundUserNotification Enable
RemoteManagement Disable
UnicastResponseToMulticast Enable
Logging:
LogAllowedConnections Disable
LogDroppedConnections Disable
FileName %systemroot%\system32\LogFiles\Firewall\pfirewall.log
MaxFileSize 4096
Ok.
将私有配置文件和公共配置文件的状态(开/关)分为2个变量的最佳方法是什么?我应该搜索单词“state”的第二个实例,删除它之前的所有内容,并将接下来的8个字母左右保存到字符串中吗?我不确定那是多么可靠;任何建议表示赞赏。
答案 0 :(得分:3)
你不应该这样做。它可能会起作用,但它不稳定。请记住,并非每个人都有英文系统设置。
那就是说,你应该更好地使用api来检索你正在寻找的值。
{{1}}
他还继续指定配置文件:
{{1}}
答案 1 :(得分:3)
根据Retrieving Firewall Settings,您可以使用HNetCfg.FwPolicy2
:
dynamic fwPolicy2 = Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2")); // as NetFwTypeLib.INetFwPolicy2;
bool DomainProfileIsOn = fwPolicy2.FirewallEnabled[1]; // fwPolicy2.FirewallEnabled[NetFwTypeLib.NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN];
bool PrivateProfileIsOn = fwPolicy2.FirewallEnabled[2]; // fwPolicy2.FirewallEnabled[NetFwTypeLib.NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE];
bool PublicProfileIsOn = fwPolicy2.FirewallEnabled[4]; // fwPolicy2.FirewallEnabled[NetFwTypeLib.NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC];
对于早期绑定,您可以添加对C:\Windows\System32\FirewallAPI.dll
的引用并使用注释中的代码。
答案 2 :(得分:1)
解析它的最佳方法是使用正则表达式。尝试这样的事情:
Regex rx = new Regex(@"Private Profile Settings:[\s\S]*?State\s+(\w+)");
string status = rx.Match(text).Groups[1].Value;
()中的部分是你正在寻找的一个组,它有#1(#0是一个完整匹配的文本) - 所以你可以在rx.Match表达式中引用它。
如果您正在寻找布尔值:
bool statusbool = string.Equals(status, "ON", StringComparison.InvariantCultureIgnoreCase);