剪断这个长字符串的最佳方法

时间:2016-12-04 03:48:11

标签: c# string windows-firewall netsh

我想运行一些代码,它告诉我防火墙是打开还是关闭,用于公共和私人网络。要做到这一点,我在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个字母左右保存到字符串中吗?我不确定那是多么可靠;任何建议表示赞赏。

3 个答案:

答案 0 :(得分:3)

你不应该这样做。它可能会起作用,但它不稳定。请记住,并非每个人都有英文系统设置。

那就是说,你应该更好地使用api来检索你正在寻找的值。

来自Rod Stephens's Blog

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