检测是否连入Internet网并枚举网络接口的类

'最好在xp中编译程序;或者,将在xp下编译好的Interop.Shell32.dll文件复制到项目中,
'在xp下编译的Interop.Shell32.dll文件大小是52kb,而在Vista下编译的大小是48kb。
'使用在vista、win7下编译好的Interop.Shell32.dll文件,在xp下不能正常运行。

'---------------------------------------------------------
'这个类的主要功能是:
'测试本地计算机是否已经连接到Internet;
'枚举本地计算机中所有的网络连接;
'断开 宽带连接;
'是否是使用 宽带连接 连入Internet;
'监听网络状况。
'---------------------------------------------------------

Imports System.Net

Public Class NetworkStatus

#Region "字段"
    'Well-Known网站常量
    Private Const WellKnowWeb = "http://www.baidu.com"

    Private Const ConnectionVerb = "连接(&O)"
    Private Const DisabledVerb = "断开(&O)"
    Private Const EnabledVerb = "启用(&A)"

    '是否连入Internet的变量
    Private _IsOnInternet As Boolean = False
#End Region

#Region "是否已连入互联网 Property "
    '是否已经连接到Internet的只读属性,在类的构造函数new中初始化,
    '以后根据监听到的网络状况随时更新。
    Public ReadOnly Property IsOnInternet()
        Get
            '返回值
            Return _IsOnInternet
        End Get
    End Property
#End Region

#Region "构造函数"
    '在类的构造函数中初始化,并监听网络
    Public Sub New()
        '检测Internet状态
        Me.DetectInternet()

        '监听网络连接的状态,每当网络地址变更时将用detectinternet来处理。
        AddHandler Net.NetworkInformation.NetworkChange.NetworkAddressChanged, AddressOf Me.DetectInternet

    End Sub
#End Region

#Region "检测Internet状态 Sub"

    Private Sub DetectInternet()
        '测试本地计算机的网络连接是否可用,应至少有一个网络的物理连接是已经连接的。
        If My.Computer.Network.IsAvailable Then
            '此处不采用Ping的方法,而是使用httpwebresponse
            Try
                Dim HttpWebQe As HttpWebRequest = DirectCast(WebRequest.Create(WellKnowWeb), HttpWebRequest)
                '定义变量resp接收网络响应信息
                Dim resp As HttpWebResponse = HttpWebQe.GetResponse
                If resp.StatusCode = HttpStatusCode.OK Then
                    _IsOnInternet = True
                Else
                    _IsOnInternet = False
                End If
                '关闭resp
                resp.Close()
            Catch
                _IsOnInternet = False
            End Try
        Else
            '没有物理连接,internet当然不通
            _IsOnInternet = False
        End If
    End Sub
#End Region

#Region "查询默认的宽带连接 Function"
    '通过注册表查找默认的宽带连接
    Public Function DefaultDialNetworkConnection() As String
        ' 默认的宽带连接
        Dim LocalLinkName As String = ""
        If My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\RAS AUTODIAL\DEFAULT", "defaultinternet", Nothing) IsNot Nothing Then
            LocalLinkName = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\RAS AUTODIAL\DEFAULT", "defaultinternet", Nothing).ToString

        End If

        Return LocalLinkName
    End Function
#End Region

#Region "使用NetworkInterface枚举网络连接 Function"
    '采用net.networkinformation名称空间中的networkinterface类的GetAllNetworkIntefaces()方法,
    '枚举所有的网络连接,包括宽带。
    '当使用宽带连入网络后,以下方式将枚举出该宽带,但当宽带是断开的时,不能枚举出该宽带连接。
    '当网络连接被禁用后,使用以下方式就不能枚举出该连接。
    '因此,此方式枚举的网络连接不同于shell32方式。
    '注意:返回值是一个list(of string)类型的泛型
    Public Function EnumNetworkConnectionByNetworkInformation() As List(Of String)

        '定义所有接口的数组
        Dim nic() As Net.NetworkInformation.NetworkInterface = Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces

        '定义一个泛型,用于函数的返回值
        Dim encArray As New List(Of String)
        'Dim NetworkNumber As Integer = 0

        '遍历数组nic
        For Each Anic As Net.NetworkInformation.NetworkInterface In nic
            '排除Lookback和Tunnel
            If Not (Anic.NetworkInterfaceType = NetworkInformation.NetworkInterfaceType.Loopback _
                Or Anic.NetworkInterfaceType = NetworkInformation.NetworkInterfaceType.Tunnel) Then
                ' 添加到数组里 
                encArray.Add(Anic.Name.ToString)
            End If
        Next

        '返回值
        Return encArray

    End Function
#End Region

#Region "使用Shell32枚举网络连接 Function"

    '也是枚举网络接口,但引用com接口shell32.dll, 打开系统控制面板中的网络连接子面板。
    '使用Shell32的方式,无论网络连接是否禁用,都将枚举出。
    '当禁用/启用网络连接,在win 7下运行时会弹出UAC控制窗口。
    Public Function EnumNetworkConnectionByShell32() As List(Of String)

        '定义一个泛型,用于函数的返回值
        Dim encArray As New List(Of String)

        Dim mShell As New Shell32.Shell

        Dim NetConnection As Shell32.Folder

        NetConnection = mShell.NameSpace(49) '有了49,就可以避免遍历控制面板

        '有网络连接
        If NetConnection IsNot Nothing Then

            '遍历每一个网络连接,添加到数组中
            For Each FolderItem As Shell32.FolderItem In NetConnection.Items
                encArray.Add(FolderItem.Name.ToString)
            Next

        End If

        NetConnection = Nothing
        mShell = Nothing
        '返回结果
        Return encArray

    End Function
#End Region

#Region "启用/禁用网络连接  Function"
    '仅适用于中文windows xp以上版本

    '禁用网络连接
    Public Function DisbleConnection(ByVal ConnectionName As String) As Boolean
        ''是否是宽带连接
        'If Me.IsDialConnection(ConnectionName) Then
        '    MsgBox("请使用LanConnectClose方法断开宽带")
        '    Return False
        'End If


        Dim WinVerCommand As String

        'vista以上版本,在win 2000 或者win 7下对应的是禁用
        '具体是什么,点右键看一下
        If CType(WinVer(), Integer) >= 6 Then
            WinVerCommand = "禁用(&B)"
        Else
            'xp版本,在win xp 下对应的是停用。
            If WinVer() = "5" Then
                WinVerCommand = "停用(&B)"
            Else
                '其他版本
                Return False
            End If
        End If

        ' 
        Return ExcNetLinkMenu(ConnectionName, WinVerCommand)

    End Function

    '启用网络连接
    Public Function EnbleConnection(ByVal ConnectionName As String) As Boolean
        ''是否是宽带连接
        'If Me.IsDialConnection(ConnectionName) Then
        '    MsgBox("请使用LanConnect方法通过宽带联网")
        '    Return False
        'End If

        Return ExcNetLinkMenu(ConnectionName, EnabledVerb)

    End Function

    ''指定的网络连接是否是“宽带连接”
    'Public Function IsDialConnection(ByVal connectionname As String) As Boolean
    '    '查询已有的宽带连接
    '    Dim DialConnection As List(Of String) = Me.SearchDialNetworkConnection()
    '    If connectionname = DialConnection(0) Or connectionname = DialConnection(1) Then
    '        Return True '是宽带连接
    '    Else
    '        Return False   '不是宽带连接
    '    End If
    'End Function


    '查询Windows版本
    Private Function WinVer() As String
        Return My.Computer.Info.OSVersion.ToString.Substring(0, 1)
    End Function

    '执行启用/禁用命令
    Private Function ExcNetLinkMenu(ByVal AdapterName As String, ByVal MenuName As String) As Boolean

        Dim mShell As New Shell32.Shell
        Dim NetConnection As Shell32.Folder
        Dim NetConnectionItem As Shell32.ShellFolderItem
        Dim verb As Shell32.FolderItemVerb
        NetConnection = mShell.NameSpace(49) '有了49,就可以避免遍历控制面板
        '没有网络连接
        If NetConnection Is Nothing Then

            Return False

        Else
            '遍历每一个网络连接,是否存在指定的网络连接

            For Each FolderItem As Shell32.FolderItem In NetConnection.Items
                If FolderItem.Name = AdapterName Then
                    NetConnectionItem = FolderItem
                    '遍历每一个操作,是否存在指定的动作。
                    For Each verb In NetConnectionItem.Verbs
                        If verb.Name = MenuName Then
                            Try
                                verb.DoIt()   '在win7下,由于UAC,用户可能禁止了操作。
                                Return True   '应设法在上面的语句结束后再返回值。
                            Catch
                                Return False
                            End Try
                        End If
                    Next
                    Exit For
                End If
            Next
            Return False
        End If
    End Function

#End Region

#Region "断开/连接 宽带连接 Function"
    '假设你的电脑的PPPOE拨号连接的名字是“宽带连接”,用户名是“abc”,密码是 “123”。
    '开始拨号命令:Rasdial 宽带连接 abc 123
    '断开拨号命令:Rasdial 宽带连接 /disconnect
    '可直接使用.NET调用DOS命令。取出返回值就知道有没有拨号成功。
    '以下是使用代码。
    ''' <summary>  
    '''   网络连接。  
    ''' </summary>    
    ''' <param name="LanName">名称。</param>
    ''' <param name="User">用户名。</param>
    ''' <param name="Pass">密码。</param> 

    Public Function LanConnect(ByVal LanName As String, ByVal User As String, ByVal Pass As String) As Boolean
        '开始连接 
        'LanName必须是真实存在的连接,否则函数返回真
        Dim Info As New ProcessStartInfo("Rasdial")
        Info.Arguments = String.Format("{0} {1} {2}", LanName, User, Pass)
        Info.CreateNoWindow = True
        Info.RedirectStandardOutput = True
        Info.UseShellExecute = False
        Dim RefText As String = Process.Start(Info).StandardOutput.ReadToEnd()
        If RefText.Contains("命令已完成") Then

            Return True
        Else
            Return False
        End If
    End Function
    ''' <summary>   
    ''' 断开连接。   
    ''' </summary>    
    ''' <param name="LanName">名称。</param>  

    Public Function LanConnectClose(ByVal LanName As String) As Boolean

        '断开连接
        Dim Info As New ProcessStartInfo("Rasdial")
        Info.Arguments = String.Format("{0} {1}", LanName, "/disconnect")
        Info.CreateNoWindow = True
        Info.RedirectStandardOutput = True
        Info.UseShellExecute = False
        Dim RefText As String = Process.Start(Info).StandardOutput.ReadToEnd()
        If RefText.Contains("命令已完成") Then

            Return True
        Else
            Return False
        End If
    End Function
#End Region

#Region "返回目前正通过PPPoE方式接入互联网的宽带连接名 Function"
    '如果没有通过宽带连入互联网,函数返回""
    Public Function GetDialNameOfOnline() As String
        '用于函数的返回值
        Dim DialName As String = ""

        '如果正通过宽带连入互联网,可以通过NetworkInterface方式来检测

        '目前所有的网络连接
        Dim NIs As NetworkInformation.NetworkInterface()
        NIs = NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
        '遍历网络连接,
        For Each NI As NetworkInformation.NetworkInterface In NIs
            '   找到PPPoE类型的, 且状态是UP
            If NI.OperationalStatus = NetworkInformation.OperationalStatus.Up And _
               NI.NetworkInterfaceType = NetworkInformation.NetworkInterfaceType.Ppp Then
                '宽带连接的名字已经找到
                DialName = NI.Name
                Exit For
            End If
        Next
        '返回值
        Return DialName
    End Function
#End Region

#Region "枚举所有的宽带连接 Function"
    Public Function GetAllDialName() As List(Of String)

        Dim gadn As New List(Of String)

        '使用shell32方式枚举出所有的宽带连接
        Dim mShell As New Shell32.Shell
        Dim NetConnection As Shell32.Folder = mShell.NameSpace(49)
        Dim Verb As Shell32.FolderItemVerb

        '有网络连接
        If NetConnection IsNot Nothing Then

            '遍历每一个网络连接 
            For Each FolderItem As Shell32.FolderItem In NetConnection.Items
                '遍历每个网络连接的每个动作
                For Each Verb In FolderItem.Verbs
                    '连接的动作中包含“连接”、“断开”的就是宽带连接
                    If Verb.Name = ConnectionVerb Or Verb.Name = DisabledVerb Then
                        gadn.Add(FolderItem.Name.ToString)
                        Exit For
                    End If
                Next
            Next

        End If

        NetConnection = Nothing
        mShell = Nothing
        Return gadn
    End Function

#End Region

End Class

#Region "网络接口类型列表"
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''rin''''''''''''''''''''''
'//根据MsDN,网络接口的类型如下表
' 成员名称 说明 
' Unknown 接口类型是未知的。 
'Ethernet 网络接口使用以太网连接。以太网在 IEEE 标准 802.3 中定义。 
'TokenRing 网络接口使用令牌环连接。令牌环在 IEEE 标准 802.5 中定义。 
'Fddi 网络接口使用分布式光纤数据接口 (FDDI) 连接。FDDI 是一组用于局域网中光纤线路上的数据传输的标准。 
' BasicIsdn 网络接口使用基本速率接口综合业务数字网 (ISDN) 连接。ISDN 是一组通过电话线传输数据的标准。 
'PrimaryIsdn 网络接口使用主速率接口综合业务数字网 (ISDN) 连接。ISDN 是一组通过电话线传输数据的标准。 
' Ppp 网络接口使用点对点协议 (PPP) 连接。PPP 是使用串行设备进行数据传输的协议。 
'Loopback 网络接口是环回适配器。这种接口主要用于测试;不发送通信。 
' Ethernet3Megabit 网络接口使用以太网 3 兆位/秒连接。以太网的此版本在 IETF RFC 895 中定义。 
'Slip 网络接口使用串行线路 Internet 协议 (SLIP) 连接。SLIP 在 IETF RFC 1055 中定义。 
'Atm 网络接口使用异步传输模式 (ATM) 传输数据。 
'GenericModem 网络接口使用调制解调器。 
'FastEthernetT 网络接口使用快速以太网连接。快速以太网提供每秒 100 兆位的数据速率,也称作 100BaseT。 
'Isdn 网络接口使用为 ISDN 和 X.25 协议配置的连接。X.25 允许公用网络上的计算机使用中间计算机通信。 
'FastEthernetFx 网络接口通过光纤使用快速以太网连接。此连接类型也称为 100BaseFX。 
'Wireless80211 网络接口使用无线 LAN 连接(IEEE 802.11 标准)。 
'AsymmetricDsl 网络接口使用非对称数字用户线路 (ADSL)。 
'RateAdaptDsl 网络接口使用速率自适应数字用户线路 (RADSL)。 
'SymmetricDsl 网络接口使用对称数字用户线路 (SDSL)。 
'VeryHighSpeedDsl 网络接口使用超高数据速率数字用户线路 (VDSL)。 
'IPOverAtm 网络接口使用 Internet 协议 (IP) 与异步传输模式 (ATM) 相结合来传输数据。 
'GigabitEthernet 网络接口使用千兆以太网连接。 
'Tunnel 网络接口使用隧道连接。 
'MultiRateSymmetricDsl 网络接口使用多速率数字用户线路。 
'HighPerformanceSerialBus 网络接口使用高性能串行总线。 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#End Region

'使用netsh方式禁用网卡
'Imports System.Diagnostics

'用Process.Start   调用 netsh 
'第1步 查看是否在列表中

' netsh int show int

'netsh命令禁用启用网卡的方法分写如下:

'  禁用网卡 
'  netsh   interface   set   interface   name="本地连接"   admin=disabled 
'  启用网卡 
'  netsh   interface   set   interface   name="本地连接"   admin=enable 
'  其中的name要修改为自己的网络连接的名称,默认就是"本地连接"。
原文地址:https://www.cnblogs.com/shuiguang/p/2054112.html