Search code examples
vb.netwindows-firewall

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


Copy this into Visual Studio, add a textbox and it'll run.

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

This is an example of what I get but I only need each app to be listed once, not two times. What am I doing wrong or why does it behave like this?

qBittorrent
qBittorrent
Chrome
Chrome
Visual Studio
Visual Studio
and so on...

Solution

  • It behaves like this because rule.Name is not a unique identifier for a firewall rule. The same rule name may be used for different protocols (TCP, UDP), profiles (domain, private, public), direction (in, out), etc. If you are only interested in rule.Name, add them to a set, then print that set, as follows.

    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