如何为每个应用程序只获得一个结果而不是两个?

How do I get only one result for each app instead of double?

将此复制到 Visual Studio,添加一个文本框,它将 运行。

Const NET_FW_ACTION_ALLOW = 1
Dim fwPolicy2 = CreateObject("HNetCfg.FwPolicy2")
Dim RulesObject = fwPolicy2.Rules

For Each rule In RulesObject
    If rule.action = NET_FW_ACTION_ALLOW Then
        TextBox1.Text += rule.name & vbnewline
    End If
Next

这是我得到的示例,但我只需要列出每个应用程序一次,而不是两次。我做错了什么或者为什么会这样?

qBittorrent
qBittorrent
Chrome
Chrome
Visual Studio
Visual Studio
and so on...
For Each rule In RulesObject
    If rule.action = NET_FW_ACTION_ALLOW AndAlso TextBox1.Text.Contains(rule.name.ToString) = False Then
        TextBox1.Text += rule.name & vbnewline
    End If
Next

以上是一种方法。它只是检查它是否已经添加到文本框中。顺便说一句,我不知道 rule.name 是否已经是一个字符串所以我添加了 .ToString;如果它已经是一个字符串,则不需要添加它。

此外,我们大多数人会推荐使用 Option Strict,并将变量声明为类型。即 Dim myVar as String = "some string"

之所以如此,是因为 rule.Name 不是防火墙规则的唯一标识符。相同的规则名称可能用于不同的协议(TCP、UDP)、配置文件(domain、private、public)、方向(in、out)等。如果您只对rule.Name感兴趣,将它们添加到一个集合中,然后打印该集合,如下所示。

Const NET_FW_ACTION_ALLOW = 1
Dim fwPolicy2 = CreateObject("HNetCfg.FwPolicy2")
Dim RulesObject = fwPolicy2.Rules
Dim names As New HashSet(Of String)

' Create set of unique names.
For Each rule In fwPolicy2.Rules
    If rule.action = NET_FW_ACTION_ALLOW Then
        names.Add(rule.name)
    End If
Next

' Add names to TextBox.
For Each name As String In names
    TextBox1.Text += name & vbNewLine
Next