2013-05-08 3 views
0

Я пытаюсь разработать код, который управляет портами брандмауэра с помощью vb.net. Первая часть - список всех разрешенных портов. так что я пытаюсь этот код:Получить список открытых портов, брандмауэр Windows

Function portsList() 
    Dim ports As INetFwOpenPorts 
    Dim port As INetFwOpenPort 
    Dim myPorts() As INetFwOpenPorts 

    Dim NetFwMgrType As Type = Type.GetTypeFromProgID("HNetCfg.FwMgr", False) 
    Dim mgr As INetFwMgr = DirectCast(Activator.CreateInstance(NetFwMgrType), INetFwMgr) 
    ports = DirectCast(mgr.LocalPolicy.CurrentProfile.GloballyOpenPorts, INetFwOpenPorts) 
    Dim enumerate As System.Collections.IEnumerator = ports.GetEnumerator() 

    Dim i As Integer 
    While enumerate.MoveNext() 
     port = DirectCast(enumerate.Current, INetFwOpenPort) 
     myPorts(i) = port 
     i += 1 
    End While 


    Dim portAsString() As String 
    For j As Integer = 0 To i 
     portAsString(j) = myPorts(j).ToString 
    Next 

    Return portAsString 
End Function 


Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click 

    Dim ports() As String = portsList() 
    Dim n As String = ports.Length 
    Dim newString As String = "" 

    For h As Integer = 0 To n 
     newString = ports(h) & vbNewLine 
    Next 

    RichTextBox1.Text = newString 
End Sub 

То, что я хочу сделать, это список всех портов в Richtextbox1 после нажатия Button4. Ошибка, которую я получаю, составляет:

NullReferenceException не был отменен. В экземпляре объекта не задана ссылка на объект.

Я новичок в Vb, как я могу преодолеть это?

+0

Задумывались ли вы о сканировании открытых портов, а не о получении списка из брандмауэра? – Sam

+0

thanx @Sam Я не думал об этом. Как я уже сказал, я хочу заблокировать (закрыть) некоторые или все эти порты отрыть несколько, как мне это сделать в vb.net –

+0

Посмотрите [здесь] (http://msdn.microsoft.com/ru -us/library/aa366423.aspx) и [здесь] (http://www.johnkoerner.com/index.php?/archives/49-Creating-a-Firewall-Exception-in-VB.Net.html). Кстати, сканирование каждого порта, чтобы увидеть, может ли его открытие или закрытие может занять некоторое время (около 30 минут на удаленной машине). – Sam

ответ

0

Попробуйте это:

For port As Integer = 1 to maxPorts 
    Dim host As String = "192.168.1.7" 
    Dim hostadd As Net.IPAddress = Net.Dns.GetHostEntry(host).AddressList(0) 
    Dim EPhost As New Net.IPEndPoint(hostadd, port) 
    Dim s As New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp) 

    Try 
     s.Connect(EPhost) 
    Catch 
    End Try 
    If s.Connected Then 
     'Port opened 
    Else 
     'Port closed 
    End If 
Next 

Here у вас есть полный проект.