Se que es tarde para la respuyesta, pero creo que sirve para alguine que anda buscando alguna solucion po estos tiempos.
Yo hice lo siguiente:
1. Crea un form y agrégale un Listbox al form.
2. En el evento Form_Load agrega el siguiente código:
Code Snippet
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim ioports As New List(Of System.IO.Ports.SerialPort)
For Each portname In My.Computer.Ports.SerialPortNames
ioports.Add(New System.IO.Ports.SerialPort(portname))
Next
For Each port In ioports
If port.IsOpen Then
ListBox1.Items.Add(port.PortName)
port.close()
End If
Next
End Sub
End Class
En este controlador de eventos Load del form lo que haces es recorrer todos los puertos de la colección SerialPortNames disponible mediante la clase My y crearte una colección que luego usarás para ver si están activos. Posteriormente recorrermos cada puerto dentro de esa colección de puertos o Lista de Puertos ioPorts (una colección personalizada de puertos) para verificar si están abiertos, si no lo están no se agregarán al ListBox.
Posteriormente podrás verificar mediante un botón a activar algún puerto o a conectar algún dispositivo, y si está activo deberá aparecerte en el ListBox si usas el mismo método que hemos empleado aquí.
Además como pretendes cerrarlo, en el mismo bucle segundo para recorrer la colección o lista de puertos, podrás hacer que se cierre llamando al método Close de cada port.
Si simplemente queres saber que puertos hay y no cuales estan abiertos, solo reemplaza:
For Each port In ioports
If port.IsOpen Then
ListBox1.Items.Add(port.PortName)
port.close()
End If
por:
For Each port In ioports
ListBox1.Items.Add(port.PortName)
Saludos!