1. 程式人生 > >關閉Windows 系統當前連接的Wifi以及判斷物理虛擬網卡,有線無線網卡

關閉Windows 系統當前連接的Wifi以及判斷物理虛擬網卡,有線無線網卡

ces 3D success tar pen lin search 我們 mic

1.關閉wifi ,調用Api

 [DllImport("Wlanapi.dll", SetLastError = true)]
 public static extern uint WlanDisconnect(IntPtr hClientHandle, ref Guid pInterfaceGuid, IntPtr pReserved);

2.獲取當前連接wifi 網卡句柄

The WlanOpenHandle function opens a connection to the server.

就是為了返回 ClientHandle ,傳入WlanDisconnect(...) 中的hClientHandle 的參數。

官方解釋【A handle for the client to use in this session. This handle is used by other functions throughout the session.】

 [DllImport("Wlanapi.dll")]
 private static extern int WlanOpenHandle(uint dwClientVersion, IntPtr pReserved,  [Out]out uint pdwNegotiatedVersion, out IntPtr ClientHandle);

3.WlanDisconnect(...)中還有一個參數pInterfaceGuid要獲取,就是真實網卡(安裝了虛擬機要虛擬網卡)的唯一標識符,無線和有線還不一樣。

3.1 真實網卡可以通過Win32_NetworkAdapter(可以查詢此類的屬性,其中有【GUID】) 獲取,因為真實網卡的 PNPDeviceID 都是【PCI】開頭

SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus=2  AND PNPDeviceID LIKE PCI%‘");

以上 獲取了已連接的真實網卡,筆記本一般有無線和有線網卡,如果無線和有線都連接,獲取了兩條記錄,NetConnectionStatus 條件是連接狀態 【2】:已連接,【7】:未連接。

3.2通過Win32_NetworkAdapter我們可以獲取 真實網卡的唯一標識符 GUID. 區別有線還是無線,我們可以通過註冊表判斷註冊表路徑:HKLM\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\【GUID】\Connection

路徑下的鍵值 MediaSubType,如果Value=2,表示無線網卡。

4. 最終形成

技術分享圖片
 public static bool Disconnect()
        {
            IntPtr _clientHandle = IntPtr.Zero;
            uint negotiatedVersion;
            int code = WlanOpenHandle(1, IntPtr.Zero, out negotiatedVersion, out _clientHandle);
            NetworkInterface[] _interface = NetworkInterface.GetAllNetworkInterfaces();
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(
            @"SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus=2  AND PNPDeviceID LIKE ‘PCI%‘");
            string GUID = "";
            foreach (ManagementObject mo in searcher.Get())
            {
                GUID = mo["GUID"].ToString().Trim();
                Console.WriteLine(GUID);
                var registryKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\" + GUID + "\\Connection", false);
                if (registryKey != null)
                {
                    var mediaSubTypevalue = registryKey.GetValue("MediaSubType");
                    if (mediaSubTypevalue != null)
                    {
                        int num;
                        int.TryParse(mediaSubTypevalue.ToString(), out num);
                        if (num == 2)
                        {
                            Guid netIfaceGuid = new Guid(GUID);
                            var ERROR_SUCCESS = WlanDisconnect(_clientHandle, ref netIfaceGuid, IntPtr.Zero);
                            if (ERROR_SUCCESS == 0)
                            {
                                return true;
                            }
                            WlanCloseHandle(_clientHandle, IntPtr.Zero);//不確定
                        }
                    }
                }
            }
            return false;
        }
View Code

5.後記

我用的是NativeWifi 類庫,進行打開wifi的,NativeWifi 也是封裝了windows 的Wlanapi.dll 的方法。但是沒有關閉連接wifi方法,所以只能自己寫。

文章參考:

有線網卡與無線網卡、物理網卡與虛擬網卡的區分

關閉Windows 系統當前連接的Wifi以及判斷物理\虛擬網卡,有線\無線網卡